可能重复:
从套接字接收的流是否仅限于单个发送命令?
注意:我认为这个问题非常复杂(希望不是你们,这就是我在这里问的原因哈哈),我尽我所能尽可能简单明了地解释它。
在我的应用程序中,我不断在固定大小的缓冲区中接收字节数组。
我收到的这些字节数组系列已被“二进制”序列化。
但是,有时接收到的字节数组会大于固定大小的缓冲区,因此我需要将当前接收到的字节数组存储到容器中并再次循环以接收剩余的字节数组。
我现在的问题是如何“连接”或“组合”或“加入”我收到的所有“批次”字节数组(并存储在一个容器中,可能是一个字节数组队列)以形成一个单字节数组,然后反序列化它们?
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
// If the buffer was not filled, I have to get the number of bytes received as Thorsten Dittmar was saying, before queuing it
dataReceivedQueue.Enqueue(state.buffer);
// Get the rest of the data.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback_onQuery), state);
}
else
{
// All the data has arrived; put it in response.
response_onQueryHistory = ByteArrayToObject(functionThatCombinesBytes(dataReceivedQueue));
// Signal that all bytes have been received.
receiveDoneQuery.Set();
}
state.buffer 是接收数据的缓冲区。buffer 是一个大小为 4096 的字节数组。 state 是 StateObject 类型。
ByteArrayToObject(byte []) 负责反序列化接收到的数据并将其转换回其对象形式
functionThatCombinesBytes(Queue) 此函数将接收一个字节队列并将所有字节“组合”成一个字节数组