Socket通信

    xiaoxiao2022-07-13  174

    服务端

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Net; using System.Net.Sockets; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace SocketServer { class Program { static void Main(string[] args) { ServerStart(); Console.ReadKey(); } static void ServerStart() { //创建一个新的Socket,这里我们使用最常用的基于TCP的Stream Socket(流式套接字) //参数有 指定的地址族、套接字类型和协议 Socket serverSocket =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); //把一个ipv4或ipv6地址和端口号组合赋给socket serverSocket.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"),4399 )); //启动监听,并且设置一个最大的队列长度 serverSocket.Listen(0); Console.WriteLine("服务器启动了!"); //开始异步接受客户端连接请求 serverSocket.BeginAccept(AcceptCallBack,serverSocket); } //设置一个缓冲区,用来保存数据 static byte[] data=new byte[1024]; //异步接收客户端连接请求的回调方法 static void AcceptCallBack(IAsyncResult result) { Socket serverSocket=result.AsyncState as Socket; //这就是客户端的Socket实例,可以将其保存起来 Socket clientSocket=serverSocket.EndAccept(result); //给客户端发送一个欢迎消息 clientSocket.Send(System.Text.Encoding.UTF8.GetBytes("欢迎连接我!")); //异步接收客户端发过来的消息 clientSocket.BeginReceive(data,0,data.Length,SocketFlags.None,ReceiveCallBack,clientSocket); serverSocket.BeginAccept(AcceptCallBack, serverSocket); } //异步接收客户端发过来消息的回调方法 static void ReceiveCallBack(IAsyncResult result) { Socket clientSocket = null; try { clientSocket = result.AsyncState as Socket; int count = clientSocket.EndReceive(result); if (count == 0) { clientSocket.Close(); return; } string message = System.Text.Encoding.UTF8.GetString(data, 0, count); //读取出来消息内容 Console.WriteLine("收到了来自客户端:" + clientSocket.SocketType.ToString() + "发过来的消息:" + message); //接收下一个消息(因为这是一个递归的调用,所以这样就可以一直接收消息了) clientSocket.BeginReceive(data, 0, data.Length, SocketFlags.None, ReceiveCallBack, clientSocket); } catch (Exception e) { Console.WriteLine(e.Message); if (clientSocket!=null) { clientSocket.Close(); } } } } }

    客户端

    using System; using System.Collections.Generic; using System.Diagnostics.SymbolStore; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; namespace SocketClient { class Program { static void Main(string[] args) { ClientSocketStart(); Console.ReadKey(); } //接收数据的缓存区; static byte[] buffer = new byte[1024]; static void ClientSocketStart() { //创建一个Socket Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //连接到指定服务器的指定端口 EndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4399); clientSocket.Connect(endPoint); Console.WriteLine("客户端启动了"); //异步接收服务端的消息的方法 clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallBack, clientSocket); //接受用户输入,将消息发送给服务器端 while (true) { string message = Console.ReadLine(); if (string.IsNullOrEmpty(message)) { Console.WriteLine("输入为空请重新输入"); continue; } //关闭的条件 if (message.Equals("c")) { clientSocket.Close(); return; } byte[] data = System.Text.Encoding.UTF8.GetBytes(message); //异步发送消息 clientSocket.BeginSend(data, 0, data.Length,SocketFlags.None,null,null); } } //异步接收服务端的消息的回调方法 static void ReceiveCallBack(IAsyncResult result) { Socket clientSocket=result.AsyncState as Socket; int count=clientSocket.EndReceive(result); string message = System.Text.Encoding.UTF8.GetString(buffer, 0, count); Console.WriteLine("收到了服务端发过来的消息:"+message); } } }
    最新回复(0)