UDP的初次实验
- 一、一个简单的C#程序开始
- 二、利用UDP套接字,向另一台计算机发送文本
- 三、一个Form窗口来传递信息
- 四、通过 wireshark抓包,对数据帧进行分析
- 五、参考链接
一、一个简单的C#程序开始
使用VS2017创建一个c#控制台应用程序,记住一定是.NET Framework,至于为什么我也不知道了。(真的顶不住了,现在已经凌晨3.26。暂时不去搞懂了)。然后
我们在创建的工程项目程序中,敲入一下代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace easytest
{
class Program
{
static void Main(string[] args)
{
int i = 1;
while (i <= 50)
{
Console.WriteLine("hello cqjtu! 重交物联18级");
i++;
}
}
}
}
当然了,以上很多代码都是自带的,不用去改。
来康康效果(又回到了最初的黑框框)
二、利用UDP套接字,向另一台计算机发送文本
那么我用C#写出了一个输出50行文字的简单程序,但是!今天的重头戏是UDP。
(what’s UDP is?)
Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。(来自百度百科)
Internet 的传输层有两个主要协议,互为补充。无连接的是 UDP,它除了给应用程序发送数据包功能并允许它们在所需的层次上架构自己的协议之外,几乎没有做什么特别的事情。面向连接的是 TCP,该协议几乎做了所有的事情。(来自百度百科)
这样看来好像UDP貌似就是个废啊,所有的活都被TCP包干了已经。那么UDP到底有啥用。我也懒得去一一介绍了,给个链接自己看吧
好了,我们进入正题,来给另一台电脑发送刚刚的那50行文本
我们另外创建一个控制台程序Udptest,弄代码进去:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace UDPClient
{
class Program
{
static void Main(string[] args)
{
byte[] data = new byte[1024];
string input, stringData;
//构建UDP 服务器
Console.WriteLine("This is a Client, host name is TBM");
//设置服务IP,设置UDP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.43.82"), 1316);
//定义网络类型,数据连接类型和网络协议UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string welcome = "hello! ";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ip);
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sender;
data = new byte[1024];
//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
int recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
while (true)
{
string msg = "hello cqjtu! 重交物联2018级";
int i = 1;
while(i <= 50)
{
server.SendTo(Encoding.ASCII.GetBytes(msg),Remote);
i++;
}
input = Console.ReadLine();
if (input == "exit")
break;
server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
data = new byte[1024];
recv = server.ReceiveFrom(data, ref Remote);
stringData = Encoding.ASCII.GetString(data, 0, recv);
Console.WriteLine(stringData);
}
Console.WriteLine("Stopping Client.");
server.Close();
}
}
}
这部分代码是客户端代码,也就是Sender,我要发送文本当然是使用客户端
以下是服务端代码,也就是接收方
跑起来试试,要先让服务端先跑,否则客户端发出消息后服务端还没有收到,就没了啊。
没有打开客户端的服务端
打开之后的服务端,开始疯狂接收数据__咳咳!转码原因,都是乱码?ASCII码不是乱玩的,他的电脑不关我事啦(下面的客户端//以下都是上图为服务端,下图为客户端)
咋们来输入点东东
好吧我的也是乱码,至此50个文本也就发送完了,还多亏了个‘2’
下面把服务器端的代码给出来
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace UDP
{
class Program
{
static void Main(string[] args)
{
int recv;
byte[] data = new byte[1024];
//得到本机IP,设置TCP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Any, 1316);
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//绑定网络地址
newsock.Bind(ip);
Console.WriteLine("This is a Server, host name is ZXW");
//等待客户机连接
Console.WriteLine("Waiting for a client");
//得到客户机IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)(sender);
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
//客户机连接成功后,发送信息
string welcome = "hello ! ";
//字符串与字节数组相互转换
data = Encoding.ASCII.GetBytes(welcome);
//发送信息
newsock.SendTo(data, data.Length, SocketFlags.None, Remote);
while (true)
{
data = new byte[1024];
//发送接收信息
recv = newsock.ReceiveFrom(data, ref Remote);
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
newsock.SendTo(data, recv, SocketFlags.None, Remote);
}
}
}
}
三、一个Form窗口来传递信息
创建一个Windows窗体应用,
在设计界面添加一个按钮Button,和一个输入框Box;
在Button1_Click加入代码:
byte[] data = new byte[1024];
string input;
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.43.82"), 1316);
//定义网络类型,数据连接类型和网络协议UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
server.SendTo(data, data.Length, SocketFlags.None, ip);
IPEndPoint sende = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sende;
data = new byte[1024];
//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
int recv = server.ReceiveFrom(data, ref Remote);
input = textBox1.Text;
if (input == "exit")
server.Close();
server.SendTo(Encoding.ASCII.GetBytes(input), Remote);
server.Close();
在CS的main函数下添加代码:
byte[] data = new byte[1024];
//构建TCP 服务器
Console.WriteLine("This is a Client, host name is TBM");
//设置服务IP,设置TCP端口号
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("192.168.43.82"), 1316);
//定义网络类型,数据连接类型和网络协议UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
string welcome = "success connect! ";
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ip);
IPEndPoint sende = new IPEndPoint(IPAddress.Any, 0);
EndPoint Remote = (EndPoint)sende;
data = new byte[1024];
//对于不存在的IP地址,加入此行代码后,可以在指定时间内解除阻塞模式限制
int recv = server.ReceiveFrom(data, ref Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
在另一端电脑上开启服务端,然后再开启客户端
输入数字1,点击发送
四、通过 wireshark抓包,对数据帧进行分析
筛选UPD包,抓住后,由此可以看见,从我的电脑IP192.168.43.100,自动分配的端口60659,向192.168.43.82的端口1316,发送了包,
五、参考链接
- TCP和UDP的区别和优缺点
- 基于C#的UDP协议的同步实现
- C#使用UdpClient类进行简单通信的例子
- UDP协议与Wireshark实验
- 基于C#的UDP协议的同步实现
- C#使用UdpClient类进行简单通信的例子
- UDP协议与Wireshark实验