2011-02-06 103 views
1

我在我的应用程序中实现主/从体系结构。.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的价值是不是真正的高手发出的原始值。大多数时候价值重复。我只发送整数值到客户端或服务器,没有字符串。

为什么我得到这个任何种类的输入将真正赞赏。

+0

你的字符串处理是比较奇怪的(和马车:缓冲区太小,你就不能使用Encoding.GetString?)。此外,您似乎认为读取会返回完整的“消息”。 TCP没有消息。 Read可以返回比发送的字节数少的字节。另外,你为什么将整数作为字符串发送?只需将它们发送为固定长度的4字节消息即可。 – usr 2013-12-28 15:44:26

回答

0

你是如何安排两个线程 - 主从,如果你让他们俩没有任何同步运行有可能是一个问题。假设从机继续检查数据而没有主机给出数据,那么在这种情况下,客户端可能会得到多个重复值。事实上,你只是有时得到这个错误,并不总是指向并发错误。

+2

主人不会将作业提交给同一个从属人员,除非它获得来自从属人员的确认,它现在可以自由处理作业。我认为这样我就可以同步主人和奴隶。如果我缺少某些东西,我可以重新检查我的代码。感谢您的意见,非常感谢。 – Bikswan 2011-02-06 05:42:38

相关问题