【发布时间】:2013-09-13 18:07:07
【问题描述】:
我要做的是接收从客户端发送的大量字节(大约5MB数据)
下面是接收data(byte[])的代码
byte[] receivedBytesRaw = new byte[4000];
//first, initialize network stream
NetworkStream stream = client.GetStream();
//The bytesNeeded is the size of bytes which is a protocol sent by the client side indicating the size of byte which will be sent
int bytesNeeded = 4000;
int bytesReceived = 0;
do
{
int bytesRead = stream.Read(receivedBytesRaw, bytesReceived, bytesNeeded - bytesReceived);
networkValidation.addBytesToList(receivedBytesRaw, ref receivedBytes);
bytesReceived += bytesRead;
} while (bytesReceived < bytesNeeded);
但现在我遇到了一个问题:
每次数据到达,do while循环第一次循环,返回值(i)为26,然后再次循环,这次到" i = stream.Read(receivedBytesRaw, 0, receivedBytesRaw.Length);"时,程序似乎在等待客户端发送数据没有响应,另外,当我检查“receivedBytesRaw”时,数据不完整,只收到前13个字节,字节数组中剩余空间保持为空,stream.DataAvailable为false
为什么服务器端收到不完整的数据? 注意:当我尝试发送小数据(字符串)时,没关系
================================================ =======================
编辑
下面是发送数据的客户端代码:
private int sendData(byte[] dataSend, string IP, int portNumber)
{
TcpClient clientSide = new TcpClient();
int result = -1;
try
{
clientSide.Connect(IP, portNumber);
}
catch (Exception ex)
{
return 2;
}
NetworkStream netStream = clientSide.GetStream();
if (netStream.CanWrite)
{
byte[] replyMsg = new byte[1024];
netStream.Write(dataSend, 0, dataSend.Length);
netStream.Flush();
result = 0;
}
else
{
result = 1;
}
return result;
}
【问题讨论】:
-
你能把客户端的代码贴出来吗?他们需要同步发送的数据量
-
请看我编辑的代码,我已经测试了客户端并且发送的数据(字节数组)是正确的
-
您根本不知道何时停止阅读。 TCP 是流,而不是数据包格式。发送者没有说明它将发送多少字节,也没有关闭套接字。所以接收器将不可避免地陷入循环中。通过首先写入 dataSend.Length 来解决此问题。接收者现在可以先读取它并计算字节数。
-
我在服务器端做了一个小修改,结果还是一样..
-
@user2191496 你试过 Jeroen van Langen 提供的方法吗?
标签: c# network-programming networkstream