前提・実現したいこと
C# フォームアプリケーションでソケット通信を行うプログラムを作成しています。
button1を押すと接続先とソケット通信を行い、
button2を押すとソケット通信を利用したコマンドのやり取りを行うようになっています。
プログラム(フォーム)を閉じるときはソケット通信をcloseするように組んでいるのですが
button1、button2、FormClosing、それぞれで最初に宣言した TcpClient client を
呼び出したいので、public partial class Form1 : Form のところで宣言してあります。
button1を押して接続がうまくできなかった場合、環境を整えてから
再度button1を押して接続トライできるようにプログラムを構成したいのですが、
下記ソースだとbutton1を押して接続がうまくできなかった時点でTcpClient clientが
消えてしまい、再度button1を押してもclientを再び宣言しなくてはいけない状態になります。
button1の中で TcpClient client を宣言してしまうと、button2、FormClosingのところで
clientの呼び出しができないため、どのようにプログラムを組めば良いか悩んでいます。
初歩的な内容になりますが、どなたかご教授頂けないでしょうか?
該当のソースコード
Visual
1using System; 2using System.Collections.Generic; 3using System.Drawing; 4using System.Threading.Tasks; 5using System.Windows.Forms; 6using System.Net.Sockets; 7using System.Net; 8using System.Threading; 9 10namespace Connect 11{ 12 public partial class Form1 : Form 13 { 14 IPAddress ipAddress = IPAddress.Parse("192.168.3.39"); //IPアドレス入力 15 int port = 2999; //接続ポート 16 17 //ソケット通信 18 public TcpClient client = new TcpClient(); 19 20 21 public Form1() 22 { 23 InitializeComponent(); 24 } 25 26 private void button1_Click(object sender, EventArgs e) 27 { 28 //ソケット通信開始 29 try 30 { 31 int timeout = 500; //接続タイムアウト時間 (msec) 32 33 Task con_task = client.ConnectAsync(ipAddress, port); //接続先から応答がないとフリーズしてしまうのでTask処理 34 if (!con_task.Wait(timeout)) // 接続拒否などは AggregateException 35 { 36 throw new SocketException(10060); // 10060 -> タイムアウト 37 } 38 else 39 { 40 MessageBox.Show("Socket通信 接続成功"); //接続成功 41 } 42 } 43 catch (SocketException) //接続エラー 44 { 45 client.Close(); 46 MessageBox.Show("Socket通信 応答無し"); 47 } 48 catch (AggregateException) //接続拒否 49 { 50 client.Close(); 51 MessageBox.Show("Socket通信 接続拒否"); 52 } 53 } 54 55 private void Form1_FormClosing(object sender, FormClosingEventArgs e) 56 { 57 client.Close(); 58 MessageBox.Show("Socket closed"); 59 } 60 61 private void button2_Click(object sender, EventArgs e) 62 { 63 if (client.Connected) 64 { 65 try 66 { 67 NetworkStream stream = client.GetStream(); 68 //データ通信の構文↓(省略) 69 // 70 // 71 } 72 73 catch (Exception) 74 { 75 MessageBox.Show("応答無し"); 76 } 77 } 78 else 79 { 80 MessageBox.Show("Socket通信 接続できていません"); 81 } 82 83 } 84 } 85} 86