Socket异步通信学习三
接下来是客户端部分,采用同步接收模式,在SocketClient项目中新建了一个SynServer类,用于存放socket服务器代码,和AsynServer类似,主要有4个方法:
有一个全局socket,下面四个方法中都用到。
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
类框架如下:
1.构造方法 public SynClient(IPEndPoint serverIp)
传入一个终结点参数,连接服务器,代码如下:
public SynClient(IPEndPoint serverIp) { Console.WriteLine("**连接服务器**"); socket.Connect(serverIp); Console.WriteLine("**连接成功**"); SynSend("Client:Hello!Server."); SyncReceive(); }
当服务器端开启监听服务(Accept()),后,客户端通过connect()方法连接服务器,serverIp是服务器的终结点地址,本机调试配置为127.0.0.1:port,在main()函数中配置。
2.同步发送函数 public int SynSend(string msg)
public int SynSend(string msg) { Socket socket = this.socket; byte[] data = Encoding.UTF8.GetBytes(msg); try { int sendLength = socket.Send(data); Console.WriteLine("SynSend {0} bytes to server:{1} successfully", sendLength,socket.RemoteEndPoint.ToString()); } catch (SocketException e) { Console.WriteLine("发送失败:{0} \n Error code:{1}", e.Message, e.ErrorCode); return e.ErrorCode; } return 0; }
3.同步接收函数 public virtual void SyncReceive()
public virtual void SyncReceive() { //StringBuilder sb = new StringBuilder(1024*1024); Thread th = new Thread(() => { while (receiveFlag) { byte[] buffer = new byte[1024]; int r = socket.Receive(buffer); string receiveStr = Encoding.ASCII.GetString(buffer, 0, r); Console.WriteLine(receiveStr); //sb.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, r)); } }); th.Start(); }
与异步不同,同步发送接收时系统不会像异步收发时自动开线程,所以SynSend()会阻碍主线程,因为只发送了一次,所以没有为它手动开线程,而SyncReceive()给它开了一个线程,线程中使用while循环一直接收,是程序在接收的过程中还可以处理其他业务。
4.释放资源函数 public void Close()
public void Close() { socket.Dispose(); socket.Close(); }
服务器和客户端类都写好后,我们来调试一下,在两个主函数中配置终结点,并调用服务类,截图如下:
服务器: 使用本机地址127.0.0.1端口8888
客户端:终结点地址和服务器开的监听地址一致
补充一下,第一篇中的框架截图中有错别字,在截一次------
最后测试一下结果,进入Debug目录,先打开SocketServer.exe,再打开SocketClient.exe,显示结果如下:
本次通信成功,客户端收到了服务器的消息,服务器也收到了客户端的消息。
前三篇中完成了最基本的通信,接下来文章将在此基础上增加通信控制,以及解决接收时的黏包问题。如果大家觉得博文中有什么不足的地方,欢迎指出,我在努力提高自己的技术是也会努力提高我的写作技巧和表达能力的:-)