我正在使用.NET Framework 4.6.2和C#开发套接字服务器和客户端。
客户端是 SynchronousSocketClient
。
服务器类或多或少像这个one。
在客户端上,我发送数据以更新数据库。
在服务器上,我在数据库中进行操作(使用存储过程更新表)。
该过程是客户端将数据发送到服务器,服务器对数据进行处理并发送回带有结果的消息。
有时,该数据库操作会花费更多时间来执行此操作。当此时间大于Socket.ReceiveTimeout
时,由于超时,我得到了SocketException
,但我不处理来自服务器的数据。
有什么方法可以处理服务器发送的数据?
超时后,我不再等待服务器发送的数据,而是再次启动该过程,将新数据发送到服务器,但是当我尝试从此新数据中读取服务器结果时,我会读取服务器响应对于前一个。
客户端上的过程很关键,我迫不及待地想从服务器上获得答案。我需要继续处理数据。
最佳答案
我建议在向服务器发送消息时使用ID。 (您可以使用发送缓冲区的前2个字节)服务器在发送响应时将使用此ID。现在,在客户端,您可以检查您的响应是否具有相同的ID。如果有,您可以使用数据,否则,您将其丢弃,然后尝试读取下一个传入的响应。
示意图如下所示:
ID = 1
Client ------------> Server
ID = 1
Client <------------ Server
ID = 2
Client ------------> Server
X----ERROR----TimeOut
ID = 3
Client ------------> Server
ID = 2
Client <------------ Server
Client 3!=2 --> do not process, read again
ID = 3
Client <------------ Server
关于c# - 删除套接字超时后读取的所有待处理数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41218294/