tcp和udp基本概念
tcp:(transmission control protocol)是一种面向连接、可靠的、基于字节流的传输层通信协议。并且提供了全双工通信,允许俩个应用直接建立一个可靠的连接以进行数据交换/udp:(user datagram protocol):是一种无连接、不可靠、基于数据报文传输层协议,它不提供数据包的分组。排序和组装功能也不提供可靠性的保证
tcp和udp区别
1.tcp是基于连接 而udp基于非连接
2.tcp传输数据稳定可靠,适用于对网络通信质量要求高的场景,需要准确无误发给对方 例如 传输文件 发送邮件 浏览网页
3.udp优点是速度快,轻量级。但是有可能会产生丢包,所以适用于实时性要求较高的但是对丢包没有要求太高场景,例如 域名查询 语音通话 视频直播等
udp协议特点
1.udp基于ip的简单的协议,不可靠的协议
2.优点就是简单 轻量化 传输速度高、要求可靠性不太高
3.缺点:没有流量控制,没有应答确认机制。不能解决丢包重发错顺序问题
udp使用场景
当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时可以使用udp协议。例如语音和视频聊天。主要在这些场景如果丢了一俩个数据包 不会产生太大的影响。
udp服务器
控件
两个按钮(打开服务器按钮,发送消息按钮),输入框,文本框控件(richtextbox:显示聊天)
打开服务器按钮方法
创建全局变量 socket
// 先讲socket进行客户端和服务器的书写
socket socket;
private void button1_click(object sender, eventargs e)
{
//参数1 ip地址类型 ipv4的类型
//参数2 传递数据类型 数据报文类型
//参数3 协议类型 udp协议
//1 创建socket套接字作为服务器对象
socket = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp);
// 2绑定ip和端口
ipaddress ipaddress = ipaddress.parse("192.168.107.83");
socket.bind(new ipendpoint(ipaddress,8081));
//3 接受消息
startreceive();
}
void startreceive()
{
//创建线程 开启线程
new thread(() =>
{
byte[] body = new byte[1024];
while (true)
{
int count = socket.receive(body); //接受数据
string s = encoding.utf8.getstring(body, 0, count);
richtextbox1.invoke((action)(() =>
{
richtextbox1.appendtext(s + "\t\n");
richtextbox1.selectionstart=richtextbox1.text.length;
richtextbox1.scrolltocaret();
}));
}
}).start() ;
} 发送消息事件
//发消息的方法 给指定的人发消息
string[] ips = new string[] {"192.168.107.83", };
private void button2_click(object sender, eventargs e)
{
socket.sendto(encoding.utf8.getbytes(this.textbox1.text),
new ipendpoint(ipaddress.parse("192.168.107.83"), 8082)
);
}udp客户端
控件
三个按钮(打开,发送,关闭),richtextbox(显示聊天)
public form1()
{
initializecomponent();
}
void f1()
{
byte[] body = new byte[1024];
while (true)
{
int count = socket.receive(body); //接受数据
string s = encoding.utf8.getstring(body, 0, count);
richtextbox1.invoke((action)(() =>
{
richtextbox1.appendtext(s + "\t\n");
richtextbox1.selectionstart = richtextbox1.text.length;
richtextbox1.scrolltocaret();
}));
}
}
// 打开连接
socket socket;
private void button1_click(object sender, eventargs e)
{
try
{
//1创建客户端对象
socket = new socket(addressfamily.internetwork, sockettype.dgram, protocoltype.udp);
//bind 如果前后端写的端口一致的时候 出现错误,端口号只能使用一次
//2 绑定ip和端口号
socket.bind(new ipendpoint(ipaddress.parse("192.168.107.83"), 8082));
thread th = new thread(f1);
th.start();
}
catch (exception ex)
{
messagebox.show("端口号被占用");
}
}
//发送消息
private void button2_click(object sender, eventargs e)
{
if (socket != null)
{
//参数1 发送的字符串转成字节数组
//参数2 发送数据的远程终端 new ipendpoint(ipaddress.parse("192.168.107.83"), 8081)
socket.sendto(encoding.utf8.getbytes("倒反天罡"), new ipendpoint(ipaddress.parse("192.168.107.83"), 8081));
}
}
//关闭
private void button3_click(object sender, eventargs e)
{
socket.close();//关闭
socket = null;
}到此这篇关于c# udp网络通信的实现示例的文章就介绍到这了,更多相关c# udp网络通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论