У меня есть серверно-клиентское приложение, в котором клиент передает данные изображения на сервер. У меня есть следующая структура:
Клиент:
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
Что происходит:
- сервер начинает принимать данные от клиента
- клиент отправляет данные с размером X
- сервер получает данные размером X и начинает их обрабатывать
- тем временем клиент все еще отправляет данные
- сервер не получает эти данные
- сервер закончил обработку полученных данных и теперь начинает получать от клиента
- клиент отправляет N-й пакет размера X
- сервер получает данные размера M*X
Это, очевидно, может привести к заполнению буфера на сервере и невозможности десериализации отправленных пакетов. Что мне не хватает? Что я могу сделать, чтобы добиться работы, описанной выше?
Send()
не равен одномуReceive()
. Вам нужен протокол приложения/фрейминга. Таких вопросов много. - person CodeCaster   schedule 21.07.2015