20-ESP8266 SDK開発の基本はじめに--C#TCPクライアントの書き込み、データ通信の追加

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進表示とクリア、あなたはそれを自分で行うことができます、、、

 

 

 

https://www.cnblogs.com/yangfengwu/p/11192618.html

おすすめ

転載: blog.csdn.net/qq_14941407/article/details/96325758