【问题标题】:Read & write single socket from two threads从两个线程读取和写入单个套接字
【发布时间】:2017-12-19 12:08:55
【问题描述】:

我有一个线程使用 while 循环连续读取套接字,像这样

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0){ ..... }

当它接收到某些东西(例如设备心跳)时,它会在同一个套接字上回复“ON”。

现在我想从 Thread2 发送一个字符串,并想在 Thread2 中读取相同的套接字。

但是当我发送一个字符串时,它总是从 Thread1 读取它的响应。

请给我一个解决方案。

【问题讨论】:

  • 如果您有一个线程在一个紧密的循环中从套接字读取所有内容,您如何期望 另一个 线程有机会读取?为什么你希望 both 线程仍然使用同一个套接字?如何知道设备的响应是针对 Thread1 还是 Thread2?
  • 也许你应该改变你的设计,让一个线程从套接字读取并通知任何其他感兴趣的线程。或者解释一下你真正想要做什么
  • 为什么首先需要线程?
  • 好的,让我解释一下我想要做什么。其实我想读一个跟踪设备。设备启动与服务器的连接,连接成功后,每隔一分钟它就会不断发送它的热量,我们需要向设备发送“ON”。现在我想编写一个 API 来读取设备的其他参数,如位置。当我向设备发送一个字符串以读取其位置时,我需要将位置作为 API 的响应返回,这就是为什么我希望在 Thread2 中做出响应。现在请指导我最好的方法。
  • 假设这是 TCP,请记住 TCP 抽象是双向的无穷无尽的字节流。如果您希望能够发送和接收离散的 消息,则由 在 TCP 上实现它(或转移到已经实现消息传递的更高级别的协议)。不能保证在一端对 Write 的每次调用都会与另一端对 Read 的调用进行 1-1 匹配。

标签: c# multithreading sockets


【解决方案1】:

“经典”方式是拥有一个仅从套接字读取的“读取”线程和另一个在生产者-消费者“输入”队列上等待请求的“协议”线程,处理您的所有协议并可以写入根据请求/协议的要求连接到套接字。这将包括您的“心跳”回复。

请求类型可以是一个包含“rx”和“tx”字节缓冲区的结构、一个标识请求类型的枚举(例如“EdataRx”、“EsendAPU”),也可以是一个信号量,任何线程希望与设备同步交换数据,等待协议线程在完成交换后发出信号。

请求结构类型可能应该有其他有用的东西,例如。用于传回错误编号/消息的 int 或字符串。

根本无法正常工作的是尝试从多个线程读取或写入套接字。只是不要尝试。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多