Я реализую архитектуру Master / Slave в моем приложении.
Мастер опрашивает задания из базы данных, а затем распределяет задания среди подчиненных. Я использую сокетное соединение, чтобы поддерживать соединение между ведущим и подчиненным и отправлять задание клиенту.
Как только мастер инициирует процесс, один поток начинает создавать очередь заданий, а другой поток начинает получать задания из очереди и передавать их всем подключенным ведомым устройствам по одному. Как только ведомое устройство завершит работу, оно отправит мастеру подтверждение того, что оно свободно, и мастер снова передаст работу этому клиенту. Если очередь пуста, мастер просто отправляет некоторое подтверждение клиенту, после чего клиент снова отправляет некоторое подтверждение мастеру, и мастер снова проверяет очередь и отправляет задание, если доступно. Этот процесс продолжается до тех пор, пока мастер не решит, что все работы выполнены.
Подтверждение - не что иное, как какое-то постоянное значение. Всякий раз, когда клиент получает это постоянное значение, клиент отправляет то же значение обратно мастеру, а если мастер получает эти постоянные значения, он отправляет задание, если оно доступно в очереди, в противном случае отправляет это же значение обратно клиенту. Таким образом, ведущий и подчиненные продолжают общаться, пока все работы не будут выполнены.
Я работаю с сервером c # windows, используя асинхронные сокеты.
Моя проблема заключается в том, что при обработке данных, полученных на стороне клиента, некоторое время клиент получает перекрывающиеся значения. Это происходит в следующем событии клиентского сокета:
public void OnDataReceived(IAsyncResult asyn)
{
SocketPacket theSockId = null;
try
{
theSockId = (SocketPacket)asyn.AsyncState;
int iRx = theSockId.currentSocket.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);
if (OnDataRecievedFromMaster != null)
{
OnDataRecievedFromMaster(Convert.ToInt32(szData), theSockId.hostName);
}
//richTextRxMessage.Text = richTextRxMessage.Text + szData;
WaitForData(theSockId.hostName);
}
catch (ObjectDisposedException)
{
System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
}
catch (SocketException se)
{
if (se.ErrorCode == 10054) // Error code for Connection reset by peer
{
//string msg = "Client " + socketData.hostName + " Disconnected" + "\n";
//AppendToRichEditControl(msg);
// Remove the reference to the worker socket of the closed client
// so that this object will get garbage collected
}
}
finally
{
}
}
в этом событии значение szdata не является исходным значением, которое действительно отправил мастер. Большую часть времени значение повторяется. Я посылаю только целочисленные значения клиенту или серверу, без строк.
Любая информация о том, почему я получаю это, будет по достоинству оценена.