https://www.cnblogs.com/yangfengwu/p/11192594.html
自分でページを調整する
接続後、率先してデータを送信します
名前空間TCPClient { パブリック部分クラスForm1:フォーム { プライベートTcpClient myTcpClient = null; // TcpClient スレッドConnectThread; //接続スレッド 文字列ipAddress; //レコードIPアドレス intポート= 0; //ポート番号 privateNetworkStream networkstrem = null; / / プライベートスレッドReceiveThreadを使用してネットワークデータを取得します; //メッセージスレッドを受信します publicForm1() { InitializeComponent(); } private void Form1_Load(object sender、EventArgs e) { getIPAddress(); //書き込まれたばかりの関数。GetcomputerIP、ドロップダウンボックスに表示されます } /// <ローカルIPアドレスを取得> /// /// </ summary> /// <returns> </ returns> private void getIPAddress() { IPAddress [] hostipspool = Dns.GetHostAddresses( ""); // IPを取得comboBox1.Items.Clear (); //ドロップダウンボックスをクリアする foreachの内容 (IPアドレスhostipspoolのIPA) { IF(ipa.AddressFamily == AddressFamily.InterNetwork) { comboBox1.Items.Add(ipa.ToString()); //ドロップダウンIPデータを追加comboBox1.SelectedIndex = comboBox1。アイテム。カウント> 0?0:-1; //最初のアイテムを表示する } } } private void ConnectMethod() { myTcpClient = new TcpClient(); // myTcpClientをインスタンス化する try { myTcpClient.Connect(ipAddress、Port); //サーバーに接続する networkstrem = myTcpClient.GetStream(); //データストリーム操作インスタンスを取得します(これはメソッドです)。与えられた.....) try { networkstrem.Write(new byte [] {0x31、0x32、0x33}、0,3); //データを送信、 "123" } catch { } //接続後、 Invokeを実行down ((new Action(()=> { button1.Text = "Disconnect"; }))); } catch(Exception) { //例外処理関数 Invoke((new Action(()=> { button1.Text = "Connect"; }))); try {myTcpClient.Close();} catch {} //閉じるconnection } } //ボタンの接続と切断 privatevoid button1_Click(object sender、EventArgs e) { if(button1.Text == "Connect") { ipAddress = comboBox1.Text.ToString (); // IPアドレスの取得 Port = Convert .ToInt32(textBox1.Text.ToString()); //ポート番号を取得する ConnectThread = new Thread(ConnectMethod); //タスクを作成する ConnectThread.Start(); //タスクの開始 } else { try {myTcpClient.Close();} catch {} //接続を閉じる Invoke((new Action(()=> { button1.Text = "Connect"; }))); } } private void comboBox1_DropDown(オブジェクト送信者、EventArgs e) { getIPAddress(); //記述されたばかりの関数 } } }
テスト
受信したデータを書き込んでから表示します
/// <メッセージスレッドの受信> /// /// </ summary> private void ReceiveDataMethod() { int RecvCnt = 0; byte [] recvBytes = new byte [1024]; while(true) { try { RecvCnt = networkstrem .Read(recvBytes、0、recvBytes.Length); //データの取得 Invoke((new Action(()=> { // new ASCIIEncoding()。GetString(recvBytes、0、RecvCnt)// byteは文字列 textBox2に変換されます.AppendText(new ASCIIEncoding()。GetString(recvBytes、0、RecvCnt)); //追加表示 )))); } catch(Exception ex) { //例外処理関数 Invoke((new Action(()=> { button1.Text = "Connect"; }))); try {ReceiveThread.Abort();} //タスク キャッチを破棄する{} try {networkstrem.Dispose();} //リソースの解放 catch {} try {myTcpClient.Close();} // TCP キャッチを閉じる{} } } }
テスト
フォームを閉じるときは、TCPを閉じます
再度最適化し、サーバーがアクティブに切断されていることを検出します
//サーバーがアクティブに切断されていることを検出する if((myTcpClient.Client.Poll(20、SelectMode.SelectRead))&&(myTcpClient.Client.Available == 0)) { myTcpClient.Close(); //閉じた後、次のプログラムは例外をスローします }
テスト
送信するように書いて、自分でボタンをダブルクリックします、、、ソフトウェアにそのボタンのクリックイベントを追加させます
byte [] sendbyte = Encoding.Default.GetBytes(textBox3.Text.ToString()); //送信されたデータを取得してバイトに変換する if(sendbyte.Length> 0) { try {networkstrem.Write(sendbyte、0、 sendbyte .Length);} //データ キャッチを送信(例外){MessageBox.Show( "接続を確認してください"、 "プロンプト!");} } else { MessageBox.Show( "データを空にすることはできません"、 "プロンプト! "); }
テスト
次に、Hexを送信します
/// <文字列から16進形式、十分になる前に自動的にゼロで埋める> /// "0054FF" ==> 16進0x000x54 0xFF /// </ summary> /// <param name = "hexString" > </ param> /// <returns> </ returns> private static byte [] strToToHexByte(String hexString) { int i; bool Flag = false; hexString = hexString.Replace( ""、 ""); // clearスペース if((hexString.Length%2)!= 0) { Flag = true; } if(Flag == true) { byte [] returnBytes = new byte [(hexString.Length + 1)/ 2]; 試してみてください { } for(i = 0; i <(hexString.Length-1)/ 2; i ++) { returnBytes [i] = Convert.ToByte(hexString.Substring(i * 2、2)、16); } returnBytes [returnBytes.Length-1] = Convert.ToByte(hexString.Substring(hexString.Length-1、1).PadLeft(2、 '0')、16); } catch { for(i = 0; i <returnBytes.Length; i ++) { returnBytes [i] = 0; } MessageBox.Show( "超上位16進制范围AF、已初期化是0"、 "一致"); returnbytesを返します。 } else { byte [] returnBytes = new byte [(hexString.Length)/ 2]; try { for(i = 0; i <returnBytes.Length; i ++) { returnBytes [i] = Convert.ToByte(hexString.Substring(i * 2、2)、16); } } catch { for(i = 0; i <returnBytes.Length; i ++) { returnBytes [i] = 0; } MessageBox.Show( "超上位16進制范围AF、已初期初期化是0"、 "一致"); } returnbytesを返します。 } }
テスト
さて、16進表示とクリア、あなたはそれを自分で行うことができます、、、