简介
1、UDP(User Data Protocol,用户数据报协议)
(1) UDP是一个非连接的协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
(2) 由于传输数据不建立连接,因此也就不需要维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息。
(3) UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
(4) 吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制。
(5)UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这里面有许多参数)。
udpClient服务器
搭建服务器界面
打开
UdpClient udp;
// 打开
private void button1_Click(object sender, EventArgs e)
{
// 1 创建udp对戏那个 指定ip地址和端口号
udp = new UdpClient(new IPEndPoint(IPAddress.Any, 8080));
// 2 接收数据
startReceive();
}
接收数据方法
private void startReceive()
{
new Thread(() =>
{
try
{
while (true)
{
// 创建一个ip接收客户端的ip地址
IPEndPoint ip = null;
byte[] body = udp.Receive(ref ip);
string s = Encoding.UTF8.GetString(body);
BeginInvoke((Action)(() =>
{
richTextBox1.AppendText(ip.ToString() + ":" + s + "\t\n");
}));
}
}
catch
{
}
}).Start();
}
关闭
private void button2_Click(object sender, EventArgs e)
{
udp.Close();
udp = null;
}
private void button3_Click(object sender, EventArgs e)
{
byte[] bs = Encoding.UTF8.GetBytes(this.textBox1.Text);
// 发数据
// 参数1 字节数组
// 参数2 字节长度
// 参数3 目标主机地址
// 参数4 端口号
udp.Send(bs,bs.Length,"192.168.107.60",8080);
}
udpClient组播
客户端
打开服务器
UdpClient udp;
// 打开服务器
private void button3_Click(object sender, EventArgs e)
{
udp = new UdpClient(new IPEndPoint(IPAddress.Any,8080 ));
strarReceive();
Console.WriteLine("222222");
}
异步的方式
1 new Thread() 分界线
2 Task.Run() 异步任务
3 async(异步) 和 await(等待)
async void strarReceive()
{
while (true)
{
// await 跟一个异步任务
// 等待异步任务结束之后 再去执行
//
UdpReceiveResult body = await udp.ReceiveAsync();
// body.RemoteEndPoint 远程终端
// body.Buffer 数据字节数组
BeginInvoke((Action)(() =>
{
richTextBox1.AppendText(body.RemoteEndPoint.ToString()+":"+Encoding.UTF8.GetString(body.Buffer)+"\t\n");
this.richTextBox1.ScrollToCaret();
}));
}
}
加入组播地址
private void button1_Click(object sender, EventArgs e)
{
// Join 加入
//
udp.JoinMulticastGroup(IPAddress.Parse(this.textBox1.Text)); // 加入组播地址
}
发送消息
private void button2_Click_1(object sender, EventArgs e)
{
// 发送消息
byte[] bs = Encoding.UTF8.GetBytes(this.textBox2.Text);
udp.Send(bs, bs.Length, this.textBox1.Text, 8080);
}
效果如下