我有一个服务器端客户端应用程序,客户端将图像数据传输到服务器。我有以下结构:TCP服务器接收比预期更多的数据
客户:
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)
{
//
}
}
服务器:
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的数据并开始处理它
- 客户仍然在此期间发送数据
- 服务器没有收到这个数据
- 服务器做处理接收到的数据,现在开始从客户 接收
- 转到2
正在发生的事情:
- SER版本开始从客户端接收数据
- 客户端发送数据与大小X
- 服务器接收与大小X的数据,并开始处理它
- 客户端在此期间仍在发送数据
- 服务器不接收该数据
- 服务器完成处理所接收的数据和现在开始从客户端接收
- 客户端发送第N个数据包大小为X
- 服务器接收大小为M * X 的数据3210
这显然会导致服务器上的缓冲区被填满并且无法反序列化发送的包。我错过了什么?我能做些什么来实现上述工作?
尝试阅读套接字基础知识。一个Send()不等于一个Receive()。您需要应用程序/成帧协议。像这样的问题存在很多。 – CodeCaster