我有一个服务器客户端应用程序,其中客户端将图像数据流式传输到服务器。我有以下结构:
Client:
private void SerializeAndSendMessage(Message msg) {
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, msg);
byte[] buffer = stream.ToArray();
if (clientSocket != null)
{
if (clientSocket.Connected)
{
clientSocket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, SendCallback, null);
}
}
}
private void SendCallback(IAsyncResult ar) {
try
{
clientSocket.EndSend(ar);
Debug.WriteLine("Message sent.");
}
catch (Exception ex)
{
//
}
}
Server:
private void ReceiveCallback(IAsyncResult ar)
{
try
{
int received = clientSocket.EndReceive(ar);
Array.Resize(ref buffer, received);
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream(buffer);
object obj = null;
stream.Position = 0;
try
{
obj = formatter.Deserialize(stream);
}
catch (Exception ex )
{
//
}
// processing data
Array.Resize(ref buffer, clientSocket.ReceiveBufferSize);
clientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, null);
}
catch (Exception ex)
{
//
}
}
我期望发生什么:
- 服务器开始接受客户端的数据
- 客户端发送大小为X的数据
- 服务器接收到大小为X的数据并开始处理它
- 同时客户端仍在发送数据
- 服务器没有收到此数据
- 服务器完成处理接收到的数据,现在开始从客户端接收数据
- goto 2
怎么了:
- 服务器开始接受客户端的数据
- 客户端发送大小为X的数据
- 服务器接收到大小为X的数据并开始处理它
- 同时客户端仍在发送数据
- 服务器没有收到此数据
- 服务器完成处理接收到的数据,现在开始从客户端接收数据
- 客户端发送第 N 个大小为 X 的数据包
- 服务器接收大小为M*X的数据
这显然会导致服务器上的缓冲区填满并且无法反序列化发送的包。我缺少什么?我可以做什么来实现上述工作?