文章目录
- 一、UDP介绍
- 二、C#命令行/控制台hello world程序
- (一)创建项目
- (二)客户端程序
- (三)服务端程序
- (四)使用wireshark抓包
- 三、C#Form窗口程序
- (一)创建项目
- (二)客户端程序
- (三)服务端程序
- (四)wireshark抓包
- 四、参考
一、UDP介绍
UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
UDP的优势:
①开销更小
TCP为了保证其可靠性,首部包含20字节,以及40字节的可选项,UDP首部只有8字节;
②速度更快
UDP发送数据之前没有TCP的连接建立过程;
TCP提供了过多的保护,在及时性上做了很多的妥协,比如:控制微包(Nagle算法),延时ACK,流量控制,超时重传等,这些设计严重影响了Tcp的速度和及时性。
二、C#命令行/控制台hello world程序
(一)创建项目
选择控制台应用
(二)客户端程序
源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;namespace UDPClient
{class Program{static void Main(string[] args){byte[] data = new byte[1024];string input;//构建TCP 服务器Console.WriteLine("这是客户端,请键入要发送的数据, 主机名为: {0}", Dns.GetHostName());//设置服务IP,设置TCP端口号IPEndPoint ip = new IPEndPoint(IPAddress.Parse("10.61.27.46"), 8000);//定义网络类型,数据连接类型和网络协议UDPSocket client = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);string welcome = "连接成功!";//字符串与字节数组相互转换data = Encoding.Default.GetBytes(welcome);//发送信息client.SendTo(data, ip);IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)sender;data = new byte[1024];//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制//接受信息int recv = client.ReceiveFrom(data, ref Remote);//输出服务端ipConsole.WriteLine("消息发送到: {0}: ", Remote.ToString());//输出接受到的信息Console.WriteLine(Encoding.Default.GetString(data, 0, recv));while (true){//读取屏幕的字符串存入input中input = Console.ReadLine();if (input == "exit")break;//将input中的字符串发送至服务端for (int i = 0; i < 50; i++){client.SendTo(Encoding.Default.GetBytes(input), Remote);}/*data = new byte[1024];//将接受自服务端的信息存入recv中recv = client.ReceiveFrom(data, ref Remote);//将字节流转为字符串string Data = Encoding.Default.GetString(data, 0, recv);//将Date中的数据打印到屏幕上Console.WriteLine(Data);*/}//输入exit后,屏幕打印下列字符串Console.WriteLine("Stopping Client.");//关闭服务端client.Close();}}
}
结果如下:
(三)服务端程序
源代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;namespace UDP
{class Program{static void Main(string[] args){int recv;byte[] data = new byte[1024];//得到本机IP,设置TCP端口号 IPEndPoint ip = new IPEndPoint(IPAddress.Any, 8000);Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);//绑定网络地址server.Bind(ip);Console.WriteLine("这是客户端, 主机名为: {0}", Dns.GetHostName());//等待客户机连接Console.WriteLine("等待客户端发送数据...");//得到客户机IPIPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);EndPoint Remote = (EndPoint)(sender);recv = server.ReceiveFrom(data, ref Remote);Console.WriteLine("消息来自于: {0}: ", Remote.ToString());Console.WriteLine(Encoding.Default.GetString(data, 0, recv));//客户机连接成功后,发送信息string welcome = "连接成功 ";//字符串与字节数组相互转换data = Encoding.Default.GetBytes(welcome);//发送信息 server.SendTo(data, Remote);while (true){data = new byte[1024];//发送接收信息//从客户机接受消息recv = server.ReceiveFrom(data, ref Remote);//将字节流信息转换为字符串string Data = Encoding.Default.GetString(data, 0, recv);//将字符串输出到屏幕上Console.WriteLine(Data);// Console.WriteLine(Encoding.Default.GetString(data, 0, recv));/*//定义字符串inputstring input;//读取屏幕上的字符串input = Console.ReadLine();if (input == "exit")break;//将input发送至客户机server.SendTo(Encoding.Default.GetBytes(input),Remote);*/}server.Close();}}
}
结果为:
(四)使用wireshark抓包
发送数据时
这是我向舍友发送数据时抓到的包,可以见到源地址为10.61.131.59,这是我电脑的地址,目的地址为10.61.27.46,这是我舍友电脑的地址,端口为8000,数据为11字节,数据内容为hello world,协议为UDP。
接受数据:
这是舍友抓到的包,源地址是我电脑的地址,目的地址是她电脑的地址,协议是UDP,端口为8000,内容为hello world,数据为11字节。
三、C#Form窗口程序
(一)创建项目
新建项目,选择Windows窗体应用。
(二)客户端程序
- 窗体设计
- 代码部分
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;namespace demo
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){UdpClient udpSender = new UdpClient(0);udpSender.Connect("192.168.43.165", 8000);string message = textBox1.Text;byte[] sendBytes = Encoding.UTF8.GetBytes(message);udpSender.Send(sendBytes, sendBytes.Length);}private void label1_Click(object sender, EventArgs e){}}
}
最近电脑坏了,拿去修了,所以用的舍友的电脑。现在的IP是“192.168.43.205”,舍友的IP是“192.168.43.165”
运行结果:
(三)服务端程序
服务端程序用上面的就行,这里就不写了,接下来是运行结果
这是在舍友电脑上截到的图。
(四)wireshark抓包
客户端:
这是我抓到的包,源地址是192.168.43.205,目的地址是192.168.43.165,使用协议为UDP,端口号为8000,长度为11字节,数据内容为hello world.
服务端:
这是舍友抓到的包,源地址就是192.168.43.205,目的地址为192.168.43.165.内容为hello world,11字节,端口号为11,使用协议为UDP。
四、参考
- UDP简介
- 初识C#网络编程