if(client.Available > 0)
{
try
{
byte[] bytes = new byte[18000];
client.GetStream().Read(bytes, 0, bytes.Length);
MemoryStream stream = new MemoryStream(bytes);
stream.Seek(0, SeekOrigin.Begin);
Bitmap bit = new Bitmap(stream);
if (!Shown)
{
Shown = true;
ssViewer.Show();
ssViewer.UpdateImage(bit);
}
stream.Close();
}
catch(Exception ex)
{
PrintToConsole("There was an error in data " + ex.ToString(), ConsoleColor.Red);
MessageBox.Show(ex.ToString());
}
}
所以问题是,当我这样做时,它给我错误“参数无效”,我认为这是因为要读取的数组中的字节较少。有没有办法知道要读取的字节数来自recivedBuffer?
答案 0 :(得分:2)
读取直到没有字节为止
byte[] buffer = new byte[2048]; // read in chunks of 2KB
int bytesRead;
while((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
//do something with data in buffer, up to the size indicated by bytesRead
}
// yay no bytes left
答案 1 :(得分:0)
Read
返回读取的字节数:
var bytesRead = client.GetStream().Read(bytes, 0, bytes.Length);
因此您可以使用以下内容来构造MemoryStream
:
MemoryStream stream = new MemoryStream(bytes.Take(bytesRead).ToArray());
值得注意的是,您正在处理Stream
,这意味着您可能不会一次收到所有数据。
也就是说,如果我将“ ABC”和“ DEF”作为两个单独的消息发送,则我可以通过多种方式接收它(以下一些示例):
通常,人们会先发送一个尺寸指示符,读出来,然后用它来确定何时收到完整的“消息”。