Проблема с получением сообщений с помощью Tcp с асинхронностью

У меня был код (допустим, простое приложение для чата), я использовал Tcp с синхронизацией. но поскольку асинхронный способ вообще лучше, хотя его сложнее настроить, я решил изменить способ с синхронизации на асинхронный. но теперь я столкнулся с некоторыми проблемами при использовании async.

  1. Размер буфера: я знаю, что нам нужно учитывать ограниченный размер байтов, чтобы получить байты от партнера. Я прочитал много статей, но моя проблема не решена, у меня есть очень простой, но бесполезный способ справиться с этим, ставя символ в конце каждого сообщения; тогда получатель может понять, когда сообщение полностью получено. но у меня есть другая проблема, которая мешает мне использовать этот подход в дальнейшем для других проблем, которые он имеет для меня.

Позвольте мне объяснить мою проблему следующим кодом:

public void Send(byte[] message, Socket connection)
{
    connection.BeginSend(message, 
                         0, 
                         message.Length, 
                         SocketFlags.None, 
                         new AsyncCallback(OnSend), 
                         connection);
}

и в методе OnSend я просто использую connection.EndSend(result), где результатом является IAsyncResult. но когда я затем дважды вызываю метод Send, как в следующем коде, обратный вызов OnReceive будет получать их оба как одно сообщение.

Send(Encoding.Unicode.GetBytes("Hello"));
Send(Encoding.Unicode.GetBytes("Bye"));

мой метод OnReceiveMethod будет использовать Console.WriteLine(message);где message — это строка, полученная от однорангового узла.и вывод с использованием способа синхронизации должен быть

Hello

Bye

, но асинхронным способом я получаю его как одно сообщение, а не два, поэтому оно печатается

HelloBye

С уважением, Peyman Mortazavi

0
задан Kjartan 14 December 2012 в 13:03
поделиться