c# tcp udp 的使用场景
之前用tcp实现了一个案例(远程协助),后来我考虑用udp去实现它,于是又研究了下udp,我发现理论上udp可以做到,但是有一些问题不知道会不会有瓶颈
我参照网上写了一个简单的示例如下
服务端接收、发送数据
int recv;
byte[] data = new byte[];
IPEndPoint ipep = new IPEndPoint(IPAddress.Any, );
Socket newsock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //绑定网络地址
newsock.Bind(ipep); Console.WriteLine("This is a Server, host name is {0}", Dns.GetHostName()); //等待客户机连接
Console.WriteLine("Waiting for a client"); //得到客户机IP
IPEndPoint sender = new IPEndPoint(IPAddress.Any, );
EndPoint Remote = (EndPoint)(sender);
while (true)
{
recv = newsock.ReceiveFrom(data, ref Remote);
newsock.SendTo(data, Remote);
Console.WriteLine("Message received from {0}: ", Remote.ToString());
Console.WriteLine(Encoding.ASCII.GetString(data, , recv));
}
客户端发送、接收数据
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), );
//定义网络类型,数据连接类型和网络协议UDP
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
private void button1_Click(object sender, EventArgs e)
{
byte[] data = new byte[];
string input, stringData;
//构建TCP 服务器
//设置服务IP,设置TCP端口号
for (int i = ; i<=;i++ )
{
string welcome =Guid.NewGuid().ToString();
data = Encoding.ASCII.GetBytes(welcome);
server.SendTo(data, data.Length, SocketFlags.None, ipep);
}
//Thread th = new Thread(receivedata);
//th.Start();
}
public void receivedata()
{
byte[] data = new byte[];
IPEndPoint sen = new IPEndPoint(IPAddress.Any, );
EndPoint Remote = (EndPoint)sen;
server.Bind(sen);
data = new byte[];
while (true)
{
int recv = server.ReceiveFrom(data, ref Remote);
this.Invoke((EventHandler)delegate
{
listView1.Items.Add(new ListViewItem { Text = Encoding.ASCII.GetString(data, , recv) });
});
}
}
private void Form1_Load(object sender, EventArgs e)
{
Thread th = new Thread(receivedata);
th.Start();
}
于是问题出现了,因为我发现服务端udp是一个端口,一个线程(不知道怎么做多个端口映射,貌似也不可以),假如我做即时性要求很高数据量又大的应用,譬如远程协助或者语音聊天等,所有客户端都向服务端的一个端口发送数据,客户端稍有数量的话,会不会有接收瓶颈?
于是我思考了下,假如我采用一个固定的端口用于采集客户端,采集到客户端后再给客户端分配一个端口,开辟一个线程用于监听这个客户端消息,这样的话我可以做到不同的客户端与服务器通信采用了彼此独立的端口,但是这样做和tcp协议又是很类似了,我就要改造udp,那么改造udp的成本要考虑进去,这是端口的问题,暂时不考虑端口,假设现在即时性要求降低了,只是文字聊天,服务端有一定的吞吐能力,仍然采用udp服务端做转发实现客户端与客户端的通信,那么服务端、客户端就要做心跳包,来检测连接是否断开,也要自己管理连接的状态。
因此采用udp做即时应用 少不了的两个问题
1.管理连接状态
2.解决端口映射问题(随着客户端数量增加)
当然还有其他的问题 譬如丢包、顺序等这里没有测试到
所以tcp、udp的使用场景要视情况而定,你是否有足够能力去改造udp,让它变得完美,否则就稳妥的使用tcp吧
c# tcp udp 的使用场景的更多相关文章
- TCP/UDP 协议,和 HTTP、FTP、SMTP,区别及应用场景
一.OSI 模型 OSI 模型主要作为一个通用模型来做理论分析,而TCP/IP 协议模型是互联网的实际通讯协议,两者一般做映射分析,以下不做严格区分和声明(好吧,比较懒): OSI 整个模型层次大致可 ...
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.1
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- TODO:Golang语言TCP/UDP协议重用地址端口
TODO:Golang语言TCP/UDP协议重用地址端口 这是一个简单的包来解决重用地址的问题. go net包(据我所知)不允许设置套接字选项. 这在尝试进行TCP NAT时尤其成问题,其需要在同一 ...
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.1.2
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- 高性能 TCP/UDP/HTTP 通信框架 HP-Socket v4.0.1
HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/ ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.2
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.5.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.4.1
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
随机推荐
- listView使用小技巧P66--P76
1.设置分割线高度和颜色 android:divider="@android:color/darker_gray" android:dividerHeight="10dp ...
- git远程分支回退
[本地代码回退] git reset --hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除 git reset --hard HEAD~3:将 ...
- 内存管理(1)-buddy和slub算法
Linux内存管理是一个很复杂的系统,也是linux的精髓之一,网络上讲解这方面的文档也很多,我把这段时间学习内存管理方面的知识记录在这里,涉及的代码太多,也没有太多仔细的去看代码,深入解算法,这篇文 ...
- Java IO流读写文件的几个注意点
平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不 ...
- libwebsockets 运行问题
/****************************************************************************** * libwebsockets 运行问题 ...
- tslib: Selected device is not a touchscreen (must support ABS_X and ABS_Y events)
/************************************************************************************ * tslib: Selec ...
- [转载] FFMPEG之AVRational TimeBase成员理解
FFMPEG的很多结构中有AVRational time_base;这样的一个成员,它是AVRational结构的 typedef struct AVRational{ int num; /// ...
- 迁移 Windows 上 Oracle 11.2.0.3.0 到 Linux 上 Oracle 11.2.0.3.0
一.迁移前数据库基本信息统计 查看数据库版本 SELECT * FROM V$VERSION; /* Oracle Database 11g Enterprise Edition Release 11 ...
- Navicat for MySQL导入.sql文件
首先,打开Navicat for MySQL,打开需要使用的连接,新建一个数据库名等按自己的需求填写. 打开创建的数据库,在空白处右键,选择运行SQL文件,然后找到.SQL文件所在地址即可. MySQ ...
- (转)在二元树中找出和为某一值的所有路径,java版本
摘自:http://www.cnblogs.com/qi09/archive/2011/05/24/2055643.html 4.在二元树中找出和为某一值的所有路径 题目:输入一个整数和一棵二元树. ...