以前做了一个基于udp的高频率传输数据的服务器,但最近要新增一个基于互联网的tcp服务,连接传输倒没问题,但我担心数据频率高会影响效率。我现在在服务器端的数据传输是这样的
for (int i = 0; i < TcpList.Count; i++)
{
try
{
TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
}
catch
{
TcpList.RemoveAt(i);
}
}如果我不加上try的话,有的时候客户端那边退出了程序,服务器端就会报错了。所以我不得不加了一个try。但是当客户端多的时候,并且传输数据频率高的情况下,这里本身就是一个for循环,每次还得进行一次try(我在书上看到说try很影响效率),怕影响整体的传输效率。
如果tcp这里使用异步send会更好吗?
不知道怎么样处理会更好,哪位高手愿意指点一下,十分感谢!!!
for (int i = 0; i < TcpList.Count; i++)
{
try
{
TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
}
catch
{
TcpList.RemoveAt(i);
}
}如果我不加上try的话,有的时候客户端那边退出了程序,服务器端就会报错了。所以我不得不加了一个try。但是当客户端多的时候,并且传输数据频率高的情况下,这里本身就是一个for循环,每次还得进行一次try(我在书上看到说try很影响效率),怕影响整体的传输效率。
如果tcp这里使用异步send会更好吗?
不知道怎么样处理会更好,哪位高手愿意指点一下,十分感谢!!!
谢谢,请问怎么样测试比较好,算出两种方式的运行时间对比可以不?
我刚查了一些资料,有个替代方案,感觉似乎更好,
用这个if(TcpList[i].Connected)来代替try
多谢你的建议,我用上try的时候,感觉以前看书的时候说try会很影响性能,尽量避免或少用。。
多谢你的建议,我用上try的时候,感觉以前看书的时候说try会很影响性能,尽量避免或少用。。
当你觉得你这个代码写的无可挑剔,完全不会出现死机,程序死掉的时候那你就不用吧
用不用Try在于开发者能否把握这段代码会不会出异常。在能确定不会出现异常情况就用Try 要不能确定就用上吧。性能慢总比整个程序挂的来的好
谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
用byte[]类型来发送数据
谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
自定义协义可以理解为发送业务数据之前把发送类型及长度等信息先发过去,这样对端可以根据这个包头信息进行相应处理;粘包处理就是每次接受完后,根据包头信息进行验证,将完整数据返回给上层逻辑,将不完整的数据暂存,等待下一次数据接收。
不用去掉try catch。因为在重要的地方使用它会比不使用得到的更多。
知识你的catch可以进行调整一下,表面上看不带参数的 catch 子句捕捉任何类型的异常,实际上这是掩耳盗铃。既然你使用了catch就说明你有可以预见的几种不受控制的情况发生。
为了保险,自然每种情况应对不用的处理。
{
try
{
TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
}
catch
{
TcpList.RemoveAt(i);
}
}这段代码除了try之外肯定没有问题嘛???try在频繁IO或者交互的地方。会相当的耗资源。。能不用就不用。。
谢谢,我在测试过程中,这段代码运行正常,即使客户端异常退出,也不会受到影响。但是当不用try的时候,万一传输过程中客户端退出程序,那么这里就会抱错,程序崩溃。用if(TcpList[i].Connected)这句也不能代替try,因为无法预知客户端什么时候忽然中断连接。
谢谢,我for 1万遍测试了几次,差别不明显,关键是我发现即使使用我前面if(TcpList[i].Connected)来代替try也会异常挂掉,所以现在用try是不用也得用了,而且没得选择不过小弟遇到个新问题,以前一直用udp,这次用tcp出现粘包啊,在网上找了很多资料说要自定义协议,不知道哪位大哥有代码可以参考一下么,我主要就是发送一个字符串而已啊。发过去后成了一大串
用byte[]类型来发送数据我现在是用TcpList[i].Send(Encoding.UTF8.GetBytes(“abc”));这个Encoding.UTF8.GetBytes(“abc”) 就是 byte[]吧?
{
try
{
TcpList[i].Send(Encoding.UTF8.GetBytes("data..."));
}
catch
{
TcpList.RemoveAt(i);
}
}
TcpList.RemoveAt(i);//这句运行后。。 集合应该已经改变了。。
for (int i = 0; i < TcpList.Count; i++)
我感觉这个代码应该是有问题的。