我正在使用golang编码p2p内容。对等方通过缓冲的stream
进行通信。使用此流,他们可以通过rw
从其中读取和写入数据:
rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))
rw
包含senderID和一条消息(以及一些现在不重要的内容)。
为使系统保持打开状态,我有一个goroutine始终在侦听新的传入数据:
go readWriteData(rw)
此readWriteData(rw)
有两项任务:
rw
读取传入数据rw
因此,首先解析输入数据。根据发送者和消息,答案会写入rw。其他对等方可以接收,解析,处理它并再次回答。该消息包含关键字,这些关键字使逻辑流程(一种请求-响应通信)成为可能。
到目前为止,一切都很好。我的问题是由于以下事实引起的:此goroutine go readWriteData(rw)
还包含两个读取器,这些读取器从控制台/终端读取输入:
reader := bufio.NewReader(os.Stdin)
我需要那些读者来完成第二项任务,以处理数据并发送反馈消息。第一个reader
用于开始对话。根据终端输入的内容,开始新的通信。该节点应始终对所有节点打开。
需要第二个reader
在终端中为给定的请求提供一定的答案。根据来自终端的输入,对数据进行不同的处理,并通过rw
发送不同的答案。
在goroutine中使用两个读取器的这种请求-响应通信无法正常工作:
例如:用户1开始通信,在终端中键入内容并发送请求。用户1和2都立即收到(goroutine)。问题来了:两者都在goroutine中接收数据,并且第一个reader
重新开始等待输入。但是在这种情况下,我需要第二个reader
来回答请求。
因此,存在一个问题,即这两个reader
阻塞了goroutine go readWriteData(rw)
中的流程。我该怎么解决?