Проблема:
Когда я делаю что-то вроде этого:
for (int i = 0; i < 100; i++)
{
SendMessage( sometSocket, i.ToString());
Thread.Sleep(250); // works with this, doesn't work without
}
С или без сна сервер регистрирует отправку отдельных сообщений. Однако без сна клиент в конечном итоге получает несколько сообщений в одном OnDataReceived, поэтому клиент будет получать сообщения типа:
0,
1,
2,
34,
5,
678,
9 ....
Код отправки сервера:
private void SendMessage(Socket socket, string message)
{
logger.Info("SendMessage: Preparing to send message:" + message);
byte[] byteData = Encoding.ASCII.GetBytes(message);
if (socket == null) return;
if (!socket.Connected) return;
logger.Info("SendMessage: Sending message to non " +
"null and connected socket with ip:" + socket.RemoteEndPoint);
// Record this message so unit testing can very this works.
socket.Send(byteData);
}
Клиент, получающий код:
private void OnDataReceived(IAsyncResult asyn)
{
logger.Info("OnDataReceived: Data received.");
try
{
SocketPacket theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.Socket.EndReceive(asyn);
char[] chars = new char[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(theSockId.DataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
logger.Info("OnDataReceived: Received message:" + szData);
InvokeMessageReceived(new SocketMessageEventArgs(szData));
WaitForData(); // .....
Пакет розеток:
public class SocketPacket
{
private Socket _socket;
private readonly int _clientNumber;
private byte[] _dataBuffer = new byte[1024]; ....
Я догадываюсь, что это связано с размером буфера или просто между OnDataReceived и EndReceive мы получаем несколько сообщений.
Обновление: получается, когда я ставлю Thread.Sleep в начале OnDataReceived, он получает каждое сообщение. Является ли единственным решением этой проблемы завершение моего сообщения префиксом длины и строкой, обозначающей конец?