| 分類:[C#]
ソケット通信を使ったC#プログラムを作成しています。
button1を押すと接続を行い、button2を押すと、接続しているソケット通信を利用して コマンドを送るようになっています。
button1を押した状態でも、button2を押した状態でも、呼び出せるように public partial class Form1 : Form のところで宣言してあります。↓
//ソケット通信宣言 public TcpClient client = new TcpClient();
button1を押して接続がうまくいかない場合、そのままソケット通信ができる状態にしてから 再度button1を押して接続トライを行えるようなプログラムにしたいのですがうまくできません。
↓
button1を押して接続がうまくいかなかった場合、宣言したclientが消えてしまうので button1を再び押しても接続できない状態に。 button1の動作に TcpClient client = new TcpClient(); の宣言をすると button2の動作で clientのオブジェクトを使用できず。
どのように構文を書いたらうまくいくでしょう?
using System; using System.Collections.Generic; using System.Drawing; using System.Threading.Tasks; using System.Windows.Forms; using System.Net.Sockets; using System.Net; using System.Threading;
namespace Connect { public partial class Form1 : Form { //接続先 IPAddress ipAddress = IPAddress.Parse("192.168.3.39"); int port = 2999;
//ソケット通信宣言 public TcpClient client = new TcpClient();
public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { //ソケット通信開始 try { int timeout = 500; //接続タイムアウト時間 (msec)
//接続先から応答がないとフリーズしてしまうのでTask処理 Task con_task = client.ConnectAsync(ipAddress, port); if (!con_task.Wait(timeout)) { throw new SocketException(10060); } else { MessageBox.Show("接続成功"); } } catch (SocketException) //接続エラー { MessageBox.Show("Socket通信 応答無し"); } catch (AggregateException) //接続拒否 { MessageBox.Show("Socket通信 接続拒否"); } }
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { client.Close(); MessageBox.Show("Socket closed"); }
private void button2_Click(object sender, EventArgs e) { try { NetworkStream stream = client.GetStream(); //ソケット通信によるデータ送信準備
↓ソケット通信を使ったコマンド文 (省略)
} catch (Exception) { MessageBox.Show("応答無し"); } } } } |