我正在关注本教程:
https://github.com/libp2p/go-libp2p-examples/tree/master/chat-with-mdns
简短形式:
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)
我的问题是:
我想到了那些解决方案。但我是golang的新手,所以也许你有一个更好的:
stream, err := host.NewStream(ctx, peer.ID, protocol.ID(cfg.ProtocolID))
谢谢你帮忙解决这个问题!!
这就是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
希望这可以帮助。