我正在我的应用程序中实现主/从架构。
Master从数据库中轮询作业,然后在从属服务器之间分配作业。我正在使用套接字连接来维护主服务器和从服务器之间的连接,并将作业发送到客户端。
主服务器启动进程后,一个线程开始创建作业队列,另一个线程开始从队列中获取作业,并逐个将它们提供给所有连接的从属服务器。一旦奴隶完成作业,它将向主人发送一些确认它是免费的并且主人再次将作业提供给该客户。如果队列为空,则主服务器仅向客户端发送一些确认,之后客户端再次向主服务器发送一些确认,然后主服务器再次检查队列并发送作业(如果可用)。这个过程一直持续到主人决定所有工作都完成为止。
致谢只是一些不变的价值。每当客户端收到此常量值时,客户端会将相同的值发送回主服务器,如果主服务器收到此常量值,则会在队列中发送作业,否则将相同的值发送回客户端。这样主人和奴隶就可以继续沟通,直到完成所有工作。
我正在使用异步套接字处理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的值不是master真正发送的原始值。大多数情况下,重复该值。我只向客户端或服务器发送整数值,没有字符串。
我真的很感激任何关于我为什么会这样做的意见。
答案 0 :(得分:0)
如何调度两个线程 - 主服务器和从服务器,如果让它们在没有任何同步的情况下运行,则可能存在问题。假设从站继续检查数据而没有主机给它,在这种情况下,你可能最终在客户端有多个重复值。事实上,您有时只会收到此错误,并不总是指向并发错误。