none
Socket同时读写问题 RRS feed

  • 问题

  • 有个协议通过socket通讯,两边都可以发送接收数据。完整的指令是一个请求对应一个应答。
    正常来说是需要有个读线程用来监听对方主动发过来的数据,当接收到数据后我就返回个响应信息给对方。我这边主动发送指令后也要进行读取对方响应的消息。但我该如何设计请求与响应这一对信息呢?Socket.Receive又是阻塞的,我希望最好是一个线程接收对方的指令然后响应,一个线程我这边主动发指令然后接收对方响应,两线程互相不干扰。
    2019年5月30日 4:16

答案

  • 你好,谢谢你的回答。

    现在问题是协议是请求应答式。

    假如我是上位机,对方是下位机;

    我这边建立一个读线程,去接收下位机发送过来的消息,消息有两类:一个是响应信息(之前我主动发的命令后响应的信息),一个是下位机主动发送的命令。

    如果上位机有个按钮按下后发送某指令,那么就得去读取下位机的响应信息,成功则认为成功执行,否则就得重发。这个时候我就得在读线程里判断,若是响应失败信号那我就得重发(那是不是要对该指令进行记录起来,才好重发)。一个命令发送和接收本来是一个完整的一体,结果被拆成两个部分,不是很别扭?要是有一个线程负责上位机的发送命令(上位机发送然后接收响应信息),一个线程负责下位机的发送命令(上位机接收后发送响应信息)就很完美了


    从需求出发,读写本来就应该要分离,并不别扭。。

    另外,.Net 本来就提供和成熟的,可以直接用的异步读写方案,不要自己启动线程去处理。


    学习学习....

    2019年5月30日 9:15
  • 你好,需求出发的话,会存在发送一批指令,每个指令必须要等待响应成功了才能发下一条,这改如何设计比较好呢?指令全部发送完后我还要处理其他事

    HI,极简主义,

    当你简历客户端和服务端通信的时候,你可以控制指令的发送和完成,这个需要你在自己添加逻辑来控制。比如说,开启一个线程,来控制每个通信信道的发送和完成状态。这个需要你自己来定义。

    Best regards

    Yong Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年5月31日 8:28
    版主
  • 异步服务器套接字示例

    可以參考上面的鏈結的文件。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年5月31日 10:43

全部回复

  • 有个协议通过socket通讯,两边都可以发送接收数据。完整的指令是一个请求对应一个应答。
    正常来说是需要有个读线程用来监听对方主动发过来的数据,当接收到数据后我就返回个响应信息给对方。我这边主动发送指令后也要进行读取对方响应的消息。但我该如何设计请求与响应这一对信息呢?Socket.Receive又是阻塞的,我希望最好是一个线程接收对方的指令然后响应,一个线程我这边主动发指令然后接收对方响应,两线程互相不干扰。
    Hi   极简主义,

    目前,Socket通信相关的参考比较丰富了,下面的几个博客文章你可以参考下。

    .net平台下C#socket通信(中)
    https://www.cnblogs.com/ysyn/p/4030651.html

    C# Socket简单例子(服务器与客户端通信)
    https://blog.csdn.net/ybhjx/article/details/53706674

    Note: This response contains a reference to a third party World Wide Web site. Microsoft is providing this information as a convenience to you. Microsoft does not control these sites and has not tested any software or information found on these sites; therefore, Microsoft cannot make any representations regarding the quality, safety, or suitability of any software or information found there. There are inherent dangers in the use of any software found on the Internet, and Microsoft cautions you to make sure that you completely understand the risk before retrieving any software from the Internet. 


    Best regards

    Yong Lu

    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年5月30日 6:25
    版主
  • 你好,谢谢你的回答。

    现在问题是协议是请求应答式。

    假如我是上位机,对方是下位机;

    我这边建立一个读线程,去接收下位机发送过来的消息,消息有两类:一个是响应信息(之前我主动发的命令后响应的信息),一个是下位机主动发送的命令。

    如果上位机有个按钮按下后发送某指令,那么就得去读取下位机的响应信息,成功则认为成功执行,否则就得重发。这个时候我就得在读线程里判断,若是响应失败信号那我就得重发(那是不是要对该指令进行记录起来,才好重发)。一个命令发送和接收本来是一个完整的一体,结果被拆成两个部分,不是很别扭?要是有一个线程负责上位机的发送命令(上位机发送然后接收响应信息),一个线程负责下位机的发送命令(上位机接收后发送响应信息)就很完美了


    2019年5月30日 9:07
  • 你好,谢谢你的回答。

    现在问题是协议是请求应答式。

    假如我是上位机,对方是下位机;

    我这边建立一个读线程,去接收下位机发送过来的消息,消息有两类:一个是响应信息(之前我主动发的命令后响应的信息),一个是下位机主动发送的命令。

    如果上位机有个按钮按下后发送某指令,那么就得去读取下位机的响应信息,成功则认为成功执行,否则就得重发。这个时候我就得在读线程里判断,若是响应失败信号那我就得重发(那是不是要对该指令进行记录起来,才好重发)。一个命令发送和接收本来是一个完整的一体,结果被拆成两个部分,不是很别扭?要是有一个线程负责上位机的发送命令(上位机发送然后接收响应信息),一个线程负责下位机的发送命令(上位机接收后发送响应信息)就很完美了


    从需求出发,读写本来就应该要分离,并不别扭。。

    另外,.Net 本来就提供和成熟的,可以直接用的异步读写方案,不要自己启动线程去处理。


    学习学习....

    2019年5月30日 9:15
  • 你好,需求出发的话,会存在发送一批指令,每个指令必须要等待响应成功了才能发下一条,这改如何设计比较好呢?指令全部发送完后我还要处理其他事
    2019年5月30日 9:46
  • 你好,需求出发的话,会存在发送一批指令,每个指令必须要等待响应成功了才能发下一条,这改如何设计比较好呢?指令全部发送完后我还要处理其他事

    HI,极简主义,

    当你简历客户端和服务端通信的时候,你可以控制指令的发送和完成,这个需要你在自己添加逻辑来控制。比如说,开启一个线程,来控制每个通信信道的发送和完成状态。这个需要你自己来定义。

    Best regards

    Yong Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年5月31日 8:28
    版主
  • 异步服务器套接字示例

    可以參考上面的鏈結的文件。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年5月31日 10:43
  • 恩,通过AutoResetEvent 来控制它发送接收完成点。使用socket异步读写应该会比自己建线程性能好。哈哈,主要是受老代码影响就一直这么写了。感谢大神们的无私指导

    2019年6月2日 2:32