丛林战争项目二之实现服务器端异步的消息接收
实现方法:
1.开启一个新的线程
2.使用一个回调异步执行
实现方式:
1.服务端的实现代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;namespace TCP_WebServer
{class Program{static void Main(string[] args){startServerSync(); //调用服务端Console.ReadKey(); //调用完后让程序暂停一下}static void startServerSync(){//服务端的开发//创建一个SocketSocket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//192.168.1.7这个是本机的ipv4地址,这个地址是会变动的,路由器运行时间久了就会变化//127.0.0.1是一个万用地址,如果是在本机上使用则是本机的地址,如果换一台机器,则是另一台机器的地址//IPAddress:xxx.xx.xx.xx IpEndPoint:xxx.xx.xx.xx:prot//IPAddress iPAddress = new IPAddress(new byte[] { 192,168,1,7}); //这种方式通过传递一个数组将地址解析出来,但是这种方式不推荐IPAddress ipAddress = IPAddress.Parse("192.168.1.7"); //创建ipIPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 180); //绑定端口号serverSocket.Bind(ipEndPoint); //绑定ip和端口号serverSocket.Listen(10); //参数backLog为队列中最多可以处理监听多少个Socket clientSocket = serverSocket.Accept(); //接收一个客户端连接//向客户端发送一条消息String msg = "Hello client!你好......"; //需要传递的内容byte[] data = System.Text.Encoding.UTF8.GetBytes(msg); //因为含有中文,所以需要使用一个可以将中文解析成byte数组的方法clientSocket.Send(data); //发送消息//持续不断地接收byte[] dataBuffer = new byte[1024];//开始接收,调用完这个方法后不会马上开始接收,调用完后说明开始监听客户端的数据传递,当接收到客户端的数据传递的时候才会调用ReceiveCallBack这个方法//第五个参数是一个回调方法,第六个参数是回调方法的参数clientSocket.BeginReceive(dataBuffer,0,1024,SocketFlags.None,ReceiveCallBack,clientSocket); }static byte[] dataBuffer = new byte[1024];static void ReceiveCallBack(IAsyncResult ar){Socket clientSocket = ar.AsyncState as Socket; //通过IAsyncResult获取到clientSocketint count = clientSocket.EndReceive(ar); //结束接收String msg = Encoding.UTF8.GetString(dataBuffer,0,count); //获取接收到的数据Console.WriteLine("从客户端接收到数据:"+msg); //输出获取到的数据//上面的代码只会完成一条上面消息的接收,要想重复调用,需要重新调用一下下面的方法,至此就完成了一个循环clientSocket.BeginReceive(dataBuffer, 0, 1024, SocketFlags.None, ReceiveCallBack, clientSocket);}}
}
客户端的实现代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;namespace TCP_Client
{class Program{static void Main(string[] args){StartClientAnsync();}static void StartClientAnsync(){//创建socketSocket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);IPAddress ipAddress = IPAddress.Parse("192.168.1.7"); //创建ipIPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 180); //绑定端口号clientSocket.Connect(ipEndPoint); //与远程主机建立连接//向客户端发送一条消息byte[] data = new byte[1024];int count = clientSocket.Receive(data); //接收数据String msg = Encoding.UTF8.GetString(data, 0, count);Console.Write(msg);//实现循环接收while (true){//接收客户端的一条消息string s = Console.ReadLine();clientSocket.Send(Encoding.UTF8.GetBytes(s));}Console.ReadKey();clientSocket.Close(); //}}
}
2.左边是服务端,右边是客户端
3.当从客户端循环发送消息时,服务端不断地收到了客户端的消息
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
