使用C#实现基于UDP的通信 基本原理

使用Socket进行通信中,UDP是一种轻量级的无连接的通信协议。相对于TCP的安全可靠且又可以双工通信,UDP则更强调简单高效,而且利用UDP的无连接特性,我们可以穿透局域网,很多时候能够实现TCP无法实现的功能。

本文共分为三个部分:
第一部分 UDP的基本通信开始方法。
第二部分 UDP公网通信测试
第三部分 双局域网不利用第三方公共服务器实现直接通信。
这是第一部分。
全文主要的实现方法为C#语言。

UDP的基本原理

Socket通信是典型的CS结构。服务器端为数据接受和处理方,客户端为数据请求方。首先使用C#,我们建立服务端的启动代码。

服务器端

// 0. 定义服务器的接收IP。这个IP应该是公开的,可以被所有访问者看到。
IPEndpoint serverIP = IPEndPoint(IPAddress.Parse("127.0.0.1"), 60010);

// 1. 定义一个Socket,协议为 UDP
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

// 2. 绑定 127.0.0.1:60010
serverSocket.Bind(IPEndPoint(IPAddress.Parse("127.0.0.1"), 60010));

// 3. 数据接收
EndPoint clientIP = new IPEndPoint(IPAddress.Any, 0);
byte[] revData = new byte[1024]; 
int len = serverSocket.ReceiveFrom(revData, ref clientIP);
string receivedData = Encoding.UTF8.GetString(revData, 0, len);
Console.WriteLine("S: Received \"{0}\" from {1}", receivedData, clientIP);

// 4. 发回数据
byte[] returnData = CurCoding.GetBytes("你好,我是服务器");
serverSocket.SendTo(returnData, sendData.Length, SocketFlags.None, clientIP);

说明

  • 第0步:定义公开的IP地址和端口。地址是本机IP,而端口根据实际情况进行指定。
  • 第1步:对socket进行定义。由于要使用UDP协议,在初始化时指明 ProtocolType 为 Udp.
  • 第2步:对地址进行绑定。
  • 第3步:接收数据。这里要注意两点。
    • 线程阻塞:调用 ReceiveFrom()以后,如果没有数据进入,线程会阻塞在这个地方,以等待数据接入。
    • 接收地址返回:通过对 ref clientIP 的引用,在收到数据后,会返回数据发送方的IP地址和端口。这里与TCP是不同的,因为在TCP协议中,是有连接的,所以IP地址是可以通过方法获得的。而UDP是无连接,所以在此获得。
  • 第4步:发回数据。根据获得的clientIP,将数据返回。

客户端

主要代码

// 1. 定义一个基于UDP协议的Socket
Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

// 2. 发送数据
byte[] data = Encoding.UTF8.GetBytes("你好服务器,我是客户端! ");
clientSocket.SendTo(data, data.Length, SocketFlags.None, ServerIP);

// 3. 获得返回数据。
EndPoint serverIP = new IPEndPoint(IPAddress.Any, 0);
byte[] sendData = new byte[1024];
int recv = server.ReceiveFrom(sendData, ref serverIP);
Console.WriteLine("C: Received \"{0}\" from {1}.", CurCoding.GetString(sendData, 0, recv), serverIP.ToString());

// 4. 关闭通信
clientSocket.Close();

客户说明

  • 第1步:对socket进行定义为UDP协议 。
  • 第2步:向服务器发送数据。注意:当成功发送数据后,同样也会有自己的端口可以接收数据。这点非常重要,我们可以利用这点,实现两局域网的数据通信。
  • 第3步:接收数据,同以上的服务器商。
  • 第4步:关闭socket。
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值