如何使用libp2p处理golang中的对等缓冲读写流?

问题描述 投票:1回答:1

我正在关注本教程:

https://github.com/libp2p/go-libp2p-examples/tree/master/chat-with-mdns

简短形式:

  1. 配置p2p主机
  2. 为传入连接设置默认处理函数(3.不必要)
  3. 并打开连接对等的流:

stream, err := host.NewStream(ctx, peer.ID, protocol.ID(cfg.ProtocolID))

然后,创建了一个缓冲流/读写变量:

rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))

现在,此流用于在对等体之间发送和接收数据。这是使用两个以rw作为输入的goroutine函数完成的:

go writeData(rw) go readData(rw)

我的问题是:

  1. 我想将数据发送给我的同行并需要他们的反馈:例如在rw有一个问题,他们需要回答是/否。如何转回这个答案并进行处理(启用一些交互)?
  2. 我想用rw发送的数据并不总是一样的。有时候它只是一个只包含名字的字符串,有时它是一个包含整个块的字符串等。我怎样才能区分?

我想到了那些解决方案。但我是golang的新手,所以也许你有一个更好的:

  • 我需要为每个不同的内容添加新流:stream, err := host.NewStream(ctx, peer.ID, protocol.ID(cfg.ProtocolID))
  • 我是否需要为每个不同的内容打开更多缓冲的rw变量:qazxsw poi
  • 还有其他解决方案吗?

谢谢你帮忙解决这个问题!!

go stream p2p libp2p
1个回答
0
投票

这就是rw := bufio.NewReadWriter(bufio.NewReader(stream), bufio.NewWriter(stream))从你的tuto那里做的:

readData

它基本上读取流,直到它找到一个func readData(rw *bufio.ReadWriter) { for { str, err := rw.ReadString('\n') if err != nil { fmt.Println("Error reading from buffer") panic(err) } if str == "" { return } if str != "\n" { // Green console colour: \x1b[32m // Reset console colour: \x1b[0m fmt.Printf("\x1b[32m%s\x1b[0m> ", str) } } } ,这是一个新行字符并将其打印到stdout。

\n

writeData

它从stdin读取数据,因此您可以键入消息,并将其写入func writeData(rw *bufio.ReadWriter) { stdReader := bufio.NewReader(os.Stdin) for { fmt.Print("> ") sendData, err := stdReader.ReadString('\n') if err != nil { fmt.Println("Error reading from stdin") panic(err) } _, err = rw.WriteString(fmt.Sprintf("%s\n", sendData)) if err != nil { fmt.Println("Error writing to buffer") panic(err) } err = rw.Flush() if err != nil { fmt.Println("Error flushing buffer") panic(err) } } } 并将其刷新。这种聊天可以实现一种tty聊天。如果它正常工作,你应该能够启动至少两个对等体并通过stdin进行通信。

你不应该为新内容重新创建新的rw。您可以重新使用现有的,直到您关闭它。从tuto的代码中,为每个新同伴创建一个新的rw


现在,tcp流不能作为带有请求和对应于该请求的响应的http请求。因此,如果您想发送内容并获得对该特定问题的回复,您可以发送以下格式的消息:

rw

当你收到它时,你会解析它,准备响应并以相同的格式发送它,这样你就可以匹配消息,创建一种请求/响应通信。

你可以这样做:

[8 bytes unique ID][content of the message]\n

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.