讀了好多篇文章,也沒有將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(委托實例,接收到的字符))
- 聲明線程,將線程設置為后台模式,啟動線程