.Net套接字客户端数据接收问题
我在我的应用程序中实现主/从体系结构。.Net套接字客户端数据接收问题
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的价值是不是真正的高手发出的原始值。大多数时候价值重复。我只发送整数值到客户端或服务器,没有字符串。
为什么我得到这个任何种类的输入将真正赞赏。
你是如何安排两个线程 - 主从,如果你让他们俩没有任何同步运行有可能是一个问题。假设从机继续检查数据而没有主机给出数据,那么在这种情况下,客户端可能会得到多个重复值。事实上,你只是有时得到这个错误,并不总是指向并发错误。
主人不会将作业提交给同一个从属人员,除非它获得来自从属人员的确认,它现在可以*处理作业。我认为这样我就可以同步主人和奴隶。如果我缺少某些东西,我可以重新检查我的代码。感谢您的意见,非常感谢。 – Bikswan 2011-02-06 05:42:38
你的字符串处理是比较奇怪的(和马车:缓冲区太小,你就不能使用Encoding.GetString?)。此外,您似乎认为读取会返回完整的“消息”。 TCP没有消息。 Read可以返回比发送的字节数少的字节。另外,你为什么将整数作为字符串发送?只需将它们发送为固定长度的4字节消息即可。 – usr 2013-12-28 15:44:26