UDP异步通信C#

来源:互联网 发布:三丰cmm编程视频 编辑:程序博客网 时间:2024/05/19 05:39
C# 编写的简单UDP异步通信程序(控制台)

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


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

01using System;
02using System.Text;
03using System.Net;
04using System.Net.Sockets;
05 
06namespace Client
07{
08    classProgram
09    {
10        //客户端 Socket对象
11        privatestatic Socket clientSocket;
12        //服务器端 终点
13        privatestatic EndPoint epServer;
14        //接收数据的字符数组
15        privatestatic byte[] receiveData;
16 
17        publicstatic 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            stringmsg;     //要发送的消息
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                    refepServer, new AsyncCallback(ReceiveData), null);
53            }
54        }
55 
56        //异步发送消息的委托函数
57        privatestatic void SendData(IAsyncResult iar)
58        {
59            //完成异步发送
60            clientSocket.EndSend(iar);
61        }
62 
63        //异步接收消息的委托函数
64        privatestatic void ReceiveData(IAsyncResult iar)
65        {
66            //完成异步接收  recv 表示接收到的字节数
67            intrecv = 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    classAsyncUdpServer
09    {
10        //服务器端Socket对象
11        privatestatic Socket serverSocket;
12        //接收数据的字符数组
13        privatestatic byte[] receiveData =new byte[1024];
14         
15        publicstatic 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                refepSender, new AsyncCallback(ReceiveData), epSender);
30            Console.WriteLine("Listening...");
31            Console.ReadLine();
32        }
33 
34        privatestatic void SendData(IAsyncResult iar)
35        {
36            serverSocket.EndSend(iar);
37        }
38 
39        privatestatic 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            intrecv = serverSocket.EndReceiveFrom(iar, refepSender);           
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                refepSender, new AsyncCallback(ReceiveData), epSender);
60        }
61 
62    }
63}


0 0
原创粉丝点击