C#的TCP/IP探索


  讀了好多篇文章,也沒有將C#的TCP/IP通信寫出來,這里線寫過程,日后全部完成后再做進一步整理。

  首先,去了解Socket,找到一篇Socket描述比較細致的文章:https://www.cnblogs.com/BLoodMaster/archive/2010/07/02/1769774.html

  這里,我們的目標並不是通過自己寫一對服務器和客戶端程序來測試TCP/IP消息的互通,而是通過SSCOM軟件,來分別對實現的程序進行測試。

 首先,添加一下命名空間引用

using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;

 添加窗體控件

由於異步通信需要使用線程,在線程中無法直接對控件賦值,因此使用委托的方法。例如在接收消息文本框中添加文本,代碼如下

 this.txtRecMsg.Invoke(rectxtBack,str);

  str:文本變量。

  rectxtBack:回調方法

 將接收到的消息寫入到文本框的方法代碼:

        private void setRec(string str)
        {
            txtRecMsg.AppendText(str + "\r\n");
        }

 聲明委托回調並示例化

        //定義回調
        private delegate void SetTextCallBack(string strValue);
        //聲明
        private SetTextCallBack setTextCallBack;

        //實例化代碼,寫在事件內
        setTextCallback = new SetTextCallBack(setRec);

 

使用控件的Invoke方法在線程中安全訪問控件 

       /// <summary>
        /// 接口服務器發送的消息
        /// </summary>
        private void Recive()
        {
            {
                string str = “接收到的消息”;
                this.txtRecMsg.Invoke(setTextCallback,str);
            }

        }

 

在線程中調用此方法

        threadRecive = new Thread(new ThreadStart(Recive));
        //設置為后台線程
        threadRecive.IsBackground = true;
        threadRecive.Start(); 

  

至此,設計到線程如何將消息表述到控件中的事情算完成了。還是比較麻煩,得想辦法進一步優化。不過還是把功能實現了再說。

下一步的工作是聲明和組織Socket進行通信

        //創建連Socket
        Socket socketSend; 

寫一個事件,進行遠程服務器連接

        private void btnConnection_Click(object sender, EventArgs e)
        {
            try
            {
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtIP.Text.Trim());
                socketSend.Connect(ip, Convert.ToInt32(txtPort.Text.Trim()));
                //實例化回調
                rectxtBack = new SetTextCallBack(setRec);//開啟一個新線程,不停接收服務器發送消息線程
                threadRecive = new Thread(new ThreadStart(Recive));
                //設置為后台線程
                threadRecive.IsBackground = true;
                threadRecive.Start();

            }
            catch (Exception ex)
            {

                MessageBox.Show("連接服務端出錯:" + ex.ToString());
            }
        }

完整的Recive方法

        /// <summary>
        /// 接口服務器發送的消息
        /// </summary>
        private void Recive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[2048];
                    //實際接收到的字節數
                    int r = socketSend.Receive(buffer);
                    if (r == 0)
                    {
                        break;
                    }
                    else
                    {
                        string str = Encoding.Default.GetString(buffer, 0, r - 1);
                        this.txtRecMsg.Invoke(rectxtBack,str);
                    }

                }
            }
            catch (Exception ex)
            {

                MessageBox.Show("接收服務端發送的消息出錯:" + ex.ToString());
            }
        }

至此,我們就可以通過sscom工具,配置成服務器模式,來測試能否成功接收服務器發來的消息。

做一個小總結,看看我們都需要干哪些事情:

  • 聲明一個Socket
  • 聲明一個委托
  • 寫文本框插入消息的方法
  • 實例化委托時,調用這個方法。
  • 寫線程調用方法(格式化接收數據。用Invoke方法將數據寫入控件中this.invoke(委托實例,接收到的字符))
  • 聲明線程,將線程設置為后台模式,啟動線程


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM