服务端
基本流程
- 创建套接字
- 绑定套接字的IP和端口号——Bind()
- 使套接字处于监听状态等待客户端的连接请求——Listen()
- 当请求到来后,使用BeginAccept()和EndAccept()方法接受请求,返回新的套接字
- 使用BeginSend()/EndSend和BeginReceive()/EndReceive()两组方法与客户端进行收发通信
- 返回,再次等待新的连接请求
- 关闭套接字
客户端基本流程using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace AsyncServer { public class AsyncTCPServer { public void Start() { //创建套接字 IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065); Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定端口和IP socket.Bind(ipe); //设置监听 socket.Listen(10); //连接客户端 AsyncAccept(socket); } /// /// 连接到客户端 /// /// private void AsyncAccept(Socket socket) { socket.BeginAccept(asyncResult => { //获取客户端套接字 Socket client = socket.EndAccept(asyncResult); Console.WriteLine(string.Format("客户端{0}请求连接...", client.RemoteEndPoint)); AsyncSend(client, "服务器收到连接请求"); AsyncSend(client, string.Format("欢迎你{0}",client.RemoteEndPoint)); AsyncReveive(client); }, null); } /// /// 接收消息 /// /// private void AsyncReveive(Socket socket) { byte[] data = new byte[1024]; try { //开始接收消息 socket.BeginReceive(data, 0, data.Length, SocketFlags.None, asyncResult => { int length = socket.EndReceive(asyncResult); Console.WriteLine(string.Format("客户端发送消息:{0}", Encoding.UTF8.GetString(data))); }, null); } catch (Exception ex) { Console.WriteLine(ex.Message); } } /// /// 发送消息 /// /// /// private void AsyncSend(Socket client, string p) { if (client == null || p == string.Empty) return; //数据转码 byte[] data = new byte[1024]; data = Encoding.UTF8.GetBytes(p); try { //开始发送消息 client.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult => { //完成消息发送 int length = client.EndSend(asyncResult); //输出消息 Console.WriteLine(string.Format("服务器发出消息:{0}", p)); }, null); } catch (Exception e) { Console.WriteLine(e.Message); } } } }
- 创建套接字并保证与服务器的端口一致
- 使用BeginConnect()和EndConnect()这组方法向服务端发送连接请求
- 使用BeginSend()/EndSend和BeginReceive()/EndReceive()两组方法与服务端进行收发通信
- 关闭套接字
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace AsyncClient { public class AsyncTCPClient { /// /// 连接到服务器 /// public void AsynConnect() { //端口及IP IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6065); //创建套接字 Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //开始连接到服务器 client.BeginConnect(ipe, asyncResult => { client.EndConnect(asyncResult); //向服务器发送消息 AsynSend(client,"你好我是客户端"); AsynSend(client, "第一条消息"); AsynSend(client, "第二条消息"); //接受消息 AsynRecive(client); }, null); } /// /// 发送消息 /// /// /// public void AsynSend(Socket socket, string message) { if (socket == null || message == string.Empty) return; //编码 byte[] data = Encoding.UTF8.GetBytes(message); try { socket.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult => { //完成发送消息 int length = socket.EndSend(asyncResult); Console.WriteLine(string.Format("客户端发送消息:{0}", message)); }, null); } catch (Exception ex) { Console.WriteLine("异常信息:{0}", ex.Message); } } /// /// 接收消息 /// /// public void AsynRecive(Socket socket) { byte[] data = new byte[1024]; try { //开始接收数据 socket.BeginReceive(data, 0, data.Length, SocketFlags.None, asyncResult => { int length = socket.EndReceive(asyncResult); Console.WriteLine(string.Format("收到服务器消息:{0}", Encoding.UTF8.GetString(data))); AsynRecive(socket); }, null); } catch (Exception ex) { Console.WriteLine("异常信息:", ex.Message); } } } }