问题描述
- C# socket networkstream 接收数据
- 最近在做c/s,客户端用C#的Socket进行通信。接收数据开单独的接收线程使用networkstream进行接收
接收的方法大体上跟网上流传的一样
do
{
int readSize = mNetworkstream.Read(bytes 0 1024);
if (readSize > 0)
{
//do sth
}
}while(mNetworkstream.DataAvailable)这样接收局内网或者单机没问题,但是放到外网测试网络不稳定就接收不全。
搜集很多资料,也试过在发送Socket包之前加个包大小,然后在while中增加判断是否读到包的大小,可是一样接不全,中间好像掺杂了一些没用的数据?我一个包很容易超过byte[10240],而且要整个包接收完才能处理数据。
请问C# Socket使用networkstream怎样才能接收完全呢?ps:也有听说过异步networkstream.beginread接收。鉴于网上一大抄,各种人贴各种代码片段根本就没用。有些有用但只能接收一次。。。
如果有beginread相关代码也希望大牛们贴出来参考一下,不要贴代码片段。。。
谢谢了~
解决方案
将数据包拆小,编号,收到以后再组包。
解决方案二:
C#不懂,但 Socket 通讯基本上需要分包,与重发机制,这样才能解决接收数据不全的问题。
解决方案三:
有两种方案:一是规定每次包的容量的最大值,大数据就分成多个包传送,在as端组合起来;另一种方法是在大数据包的包头附加包长内容,通过解析包头判定是否丢包,如果丢包则重发。
时间: 2024-08-01 10:14:38