UDP异步通信C#

C# 编写的简单UDP异步通信程序(控制台)

客户端发送请求,服务器端响应机制


1. [代码]UDP客户端代码    

01using System;
02using System.Text;
03using System.Net;
04using System.Net.Sockets;
05 
06namespace Client
07{
08    class Program
09    {
10        //客户端 Socket对象
11        private static Socket clientSocket;
12        //服务器端 终点
13        private static EndPoint epServer;
14        //接收数据的字符数组
15        private static byte[] receiveData;
16 
17        public static void Main(string[] args)
18        {
19            //客户端Socket对象实例化
20            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
21            //设置服务器端IP地址和对应端口
22            IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.1.165"), 11000);
23            //实例化服务器端 终点
24            epServer = (EndPoint)server;
25            string msg;     //要发送的消息
26            byte[] sendData;    //要发送的字符串
27            while (true) {
28                msg = Console.ReadLine();   //输入要发送的消息
29                if (msg == "exit") break;   //当输入“exit”时,退出客户端程序
30                //将消息通过ASCII编码转换为字符数组,
31                //如果要发送汉字或其他特殊符号,可以采用UTF-8
32                sendData = Encoding.ASCII.GetBytes(msg);   
33                //开始异步发送消息
34                //参数:sendData           要发送的数据
35                //参数:0:                 要发送数据的起始位置
36                //参数:sendData.Length:   要发送数据的字节数
37                //参数:SocketFlags.None:  按位组合方式
38                //参数:epServer:          接收方设备(包含IP和端口)
39                //参数:new AsyncCallback(SendData):   委托
40                //参数:null:          请求的状态信息
41                clientSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
42                    epServer, new AsyncCallback(SendData), null);
43                //实例化接收数据的字符数组
44                //若在声明时已经初始化,此处依然要进行重新初始化
45                //当上次接收的数据长度大于本次,则该数组里包含上次接收的残留数据
46                //比如:上次接收“你个小逗逼”。本次接收“开玩笑”。
47                //则数组中的数据为:“开玩笑逗逼”。
48                receiveData = new byte[1024];
49                //开始异步接收消息
50                //参数部分与异步发送部分对应,基本一致
51                clientSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
52                    ref epServer, new AsyncCallback(ReceiveData), null);
53            }
54        }
55 
56        //异步发送消息的委托函数
57        private static void SendData(IAsyncResult iar)
58        {
59            //完成异步发送
60            clientSocket.EndSend(iar);
61        }
62 
63        //异步接收消息的委托函数
64        private static void ReceiveData(IAsyncResult iar)
65        {
66            //完成异步接收  recv 表示接收到的字节数
67            int recv = clientSocket.EndReceive(iar);
68            //将接收到的数据打印出来
69            Console.WriteLine("Server: " + Encoding.ASCII.GetString(receiveData, 0, recv));
70        }
71 
72    }
73}

2. [代码]UDP服务器端代码    

01using System;
02using System.Text;
03using System.Net;
04using System.Net.Sockets;
05 
06namespace Server
07{
08    class AsyncUdpServer
09    {
10        //服务器端Socket对象
11        private static Socket serverSocket;
12        //接收数据的字符数组
13        private static byte[] receiveData = new byte[1024];
14         
15        public static void Main(string[] args)
16        {
17            //实例化服务器端Socket对象
18            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
19            //服务器端的IP和端口,IPAddress.Any实际是:0.0.0.0,表示任意,基本上表示本机IP
20            IPEndPoint server = new IPEndPoint(IPAddress.Any, 11000);
21            //Socket对象跟服务器端的IP和端口绑定
22            serverSocket.Bind(server);
23            //客户端的IP和端口,端口 0 表示任意端口
24            IPEndPoint clients = new IPEndPoint(IPAddress.Any, 0);
25            //实例化客户端 终点
26            EndPoint epSender = (EndPoint)clients;
27            //开始异步接收消息  接收后,epSender存储的是发送方的IP和端口
28            serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
29                ref epSender, new AsyncCallback(ReceiveData), epSender);
30            Console.WriteLine("Listening...");
31            Console.ReadLine();
32        }
33 
34        private static void SendData(IAsyncResult iar)
35        {
36            serverSocket.EndSend(iar);
37        }
38 
39        private static void ReceiveData(IAsyncResult iar)
40        {
41            //客户端的IP和端口,端口 0 表示任意端口
42            IPEndPoint client = new IPEndPoint(IPAddress.Any, 0);
43            //实例化客户端 终点
44            EndPoint epSender = (EndPoint)client;
45            //结束异步接收消息  recv 表示接收到的字符数
46            int recv = serverSocket.EndReceiveFrom(iar, ref epSender);           
47            //将接收到的数据打印出来,发送方采用什么编码方式,此处就采用什么编码方式 转换成字符串
48            Console.WriteLine("Client:" + Encoding.ASCII.GetString(receiveData, 0, recv));
49            //定义要发送回客户端的消息,采用ASCII编码,
50            //如果要发送汉字或其他特殊符号,可以采用UTF-8           
51            byte[] sendData = Encoding.ASCII.GetBytes("hello");
52            //开始异步发送消息  epSender是上次接收消息时的客户端IP和端口信息
53            serverSocket.BeginSendTo(sendData, 0, sendData.Length, SocketFlags.None,
54                epSender, new AsyncCallback(SendData), epSender);
55            //重新实例化接收数据字节数组
56            receiveData = new byte[1024];
57            //开始异步接收消息,此处的委托函数是这个函数本身,递归
58            serverSocket.BeginReceiveFrom(receiveData, 0, receiveData.Length, SocketFlags.None,
59                ref epSender, new AsyncCallback(ReceiveData), epSender);
60        }
61 
62    }
63}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值