关于NetworkStream.Read方法

zanpen2001 zanpen2001 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

NetworkStream的发送接收问题。

发送端代码:

internal bool SendByteArray(byte[] buffer, NetworkStream stream)
{
if (buffer.Length == 0) return false;
try
{
WriteSize(stream, buffer.Length);
stream.Write(buffer, 0, buffer.Length);
stream.Flush();
return true;
}
catch (Exception)
{
return false;
}
}


如下的接收端代码没有问题:

internal byte[] ReceiveByteArray(NetworkStream stream)
{


int bufferlen = GetSize(stream);
byte[] resultbyte = new byte[bufferlen];

for (int i = 0; i < bufferlen; i++)
{
resultbyte.SetValue((byte)stream.ReadByte(), i);//每次顺序读取一个字节
}
return resultbyte;
}


但改成如下形式就不行了:

internal byte[] ReceiveByteArray(NetworkStream stream)
{
int bufferlen = GetSize(stream);
byte[] resultbyte = new byte[bufferlen];
stream.Read(resultbyte, 0, resultbyte.Length);
return resultbyte;
}



或者改成下面这样,还是不行:


internal byte[] ReceiveByteArray(NetworkStream stream)
{
try
{
int bufferlen = GetSize(stream);
byte[] resultbyte = new byte[bufferlen];
stream.Read(resultbyte, 0, resultbyte.Length);
return resultbyte;

byte[] data = new byte[1024];


int index = 0, bytesread = 0;
//int r = data.Length;
while (index < bufferlen && (bytesread = stream.Read(data, 0, data.Length)) > 0)
{
//r = bufferlen - index >= 1024 ? 1024 : bufferlen - index;
data.CopyTo(resultbyte, index);
index += bytesread;
}

return resultbyte;
}
catch (Exception)
{
throw;
}


上面代码段中,WriteSize()和GetSize()分别是向stream中写入和读取流中数据大小信息的方法。

现在的问题是,不想用ReadByte()方法, 但是用Read()方法,想了很多办法都不行,其中有粘包问题,数组超界问题,各种问题,确定发送端没有使用多线程。

请高手帮忙看下是怎么回事,这段接收的代码该怎么写?

...全文

相关推荐

评论 15
收藏 已收藏
分享
返回顶部
zanpen2001
C# 111,128 成员 642,537 内容