读了好多篇文章,也没有将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(委托实例,接收到的字符))
- 声明线程,将线程设置为后台模式,启动线程