我有一個服務器端客戶端應用程序,客戶端將圖像數據傳輸到服務器。我有以下結構: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