简介
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);
}
效果如下