采用Socket实现UDP

------------恢复内容开始------------

1.1采用Socket实现UDP
1.1.1简介

Socket实现UDP的基本步骤如下:

(1)创建一个Socket对象

Socket mySocket = new Socket(AddressFamily.InterNetwork,SocketType.Dgram, ProtocolType.Udp);

AddressFamily 寻址类型

AddressFamily.InterNetwork代表IPV4。

SocketType 套接字类型

SocketType.Dgram表示使用数据报协议。

ProtocolType 协议类型

ProtocolType.Udp表示使用UDP协议

但需要注意的是套接字类型与协议类型并不是可以随便组合。如下表

2)将创建的套接字对象与本地IPEndPoint进行绑定。

完成上述步骤后,那么创建的套接字就能够在本地IPEndPoint上接收流入的UDP数据包,或者将流出的UDP数据包通过本地IPEndPoint发送到网络中其他任意设备。

mySocket.Bind(EndPointlocalEP)//绑定本地IP

SendTo()方法指定要发送的数据,和目标机器的IPEndPoint。该方法有多种不同的使用方法,可以根据具体的应用进行选择,但是至少要指定数据包和目标机器。如SendTo(byte[] data , EndPointRemote)

SocketFlags
提供 Socket 消息的常数值。

UDP应用不是严格意义上的真正的服务器和客户机,而是平等的关系,即没有主与次的关系。

ref 关键字指示按引用传递的值

ReceiveFrom()方法同SendTo()方法类似,但是使用EndPoint对象声明的方式不一样。利用ref修饰。接收方接收到数据后Remote为发送方的IP与端口信息。

如果发送方没有绑定,则发送方在发送的时候,操作系统会随机指定一个端口,接收方的Remote就是发送方随机确定的IP与端口。

ReceiveFrom()方法是一个阻塞方法,会一直等待,直到接收到数据才会往下执行程序。

int ReceiveFrom(byte[] data ,ref EndPointRemote)


实例:
 利用编程语言,基于TCP或者UDP编写一个简单的Client/Server 网络应用程序。要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户

------------恢复内容结束------------

 1 using System;
 2 using System.Text;
 3 
 4 using System.Net;
 5 
 6 using System.Net.Sockets;
 7 
 8 namespace UDPServer
 9 
10 {
11     class Program
12     {
13         static void Main(string[] args)
14         {
15             int recv;
16             byte[] data = new byte[1024];
17             IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 8001);      
18             Socket SOCKET = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
19             SOCKET.Bind(ipep);
20             Console.WriteLine("这是主机, 主机:001" );
21             Console.WriteLine("等待客户机连接.........");
22             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
23             EndPoint Remote = (EndPoint)(sender);
24             recv = SOCKET.ReceiveFrom(data, ref Remote);
25             Console.WriteLine("服务端:001, 客户端{0}, 连接成功: ", Remote.ToString());
26             Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
27             string welcome = "------------------------------------------- ";
28             data = Encoding.ASCII.GetBytes(welcome);
29             SOCKET.SendTo(data, data.Length, SocketFlags.None, Remote);
30         
31             while (true)
32 
33             {
34 
35                 data = new byte[1024];             
36                 recv = SOCKET.ReceiveFrom(data, ref Remote);              
37                 Console.WriteLine("接收信息:{0}", Encoding.ASCII.GetString(data, 0, recv));
38                 string str = System.Text.Encoding.ASCII.GetString(data);
39                 str = str.ToUpper();
40                 data = System.Text.Encoding.ASCII.GetBytes(str);
41                 SOCKET.SendTo(data, recv, SocketFlags.None, Remote);
42 
43             }
44 
45         }
46 
47 
48 
49     }
50 
51 }
 1 using System;
 2 
 3 using System.Collections.Generic;
 4 
 5 using System.Text;
 6 
 7 using System.Net;
 8 
 9 using System.Net.Sockets;
10 
11 
12 
13 namespace UDPClient
14 
15 {
16 
17     class Program
18 
19     {
20 
21         static void Main(string[] args)
22 
23         {
24 
25             byte[] data = new byte[1024];
26             string input, stringData;
27             Console.WriteLine("这是客户端, 用户:张三");
28             IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8001);
29             Socket SCOKET1 = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
30             string welcome = "--------------------------!";
31             data = Encoding.ASCII.GetBytes(welcome);
32             SCOKET1.SendTo(data, data.Length, SocketFlags.None, ipep);
33             IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
34             EndPoint Remote = (EndPoint)sender;
35             data = new byte[1024];
36             int recv = SCOKET1.ReceiveFrom(data, ref Remote);
37             Console.WriteLine("连接到服务端信息:{0}: ", Remote.ToString());
38             Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
39          
40             while (true)
41             {
42                 Console.WriteLine("请输入发送信息:");
43                 input = Console.ReadLine();
44                 if (input == "exit")
45                     break;
46                 SCOKET1.SendTo(Encoding.ASCII.GetBytes(input), Remote);
47                 data = new byte[1024];
48                 recv = SCOKET1.ReceiveFrom(data, ref Remote);
49                 stringData = Encoding.ASCII.GetString(data, 0, recv);
50                 Console.WriteLine("返回信息:");
51                 Console.WriteLine(stringData);
52                 Console.WriteLine();
53            
54 
55             }
56             Console.WriteLine("关闭客户端");
57             SCOKET1.Close();
58         }
59 
60 
61 
62     }
63 
64 }

 

posted @ 2020-05-14 21:51  不科学的烤面筋  阅读(555)  评论(1)    收藏  举报