您如何在与 libp2p-go 的直接 p2p 连接中手动刷新 Write?

问题描述

我找不到可以在 libp2p 中与对等点直接连接刷新写入的 API(它在 pubsub 中工作正常)。我在 Go 中使用 libp2p-gohost.NewStream 创建了一个直接的 libp2p 连接。该流由下面的包装器使用。问题是当我写入这个流时,另一端的对等方没有收到消息。底层的 network.Stream 似乎在 libp2p 的网络中进行了内部缓冲。但是我找不到在 network.Streamgo-libp2p-core 中的任何其他 libp2p 子包中的任何位置刷新写入的方法。其实我在任何地方都找不到。将我的包装器更改为使用 bufio 读取器和写入器没有效果,因为它不会刷新 libp2p 的内部缓冲。我知道消息已发送,因为当我关闭流时,远程对等方会收到它们。

// NetReaderWriter is a wrapper for a libp2p network stream to an individual peer.
type NetReaderWriter struct {
    stream network.Stream
}

// NewNetReaderWriter creates a new ReadWriteCloser based on a ReadCloser and a WriteCloser.
func NewNetReaderWriter(stream network.Stream) *NetReaderWriter {
    return &NetReaderWriter{
        stream: stream,}
}

// Read like in io.Reader
func (rwc *NetReaderWriter) Read(p []byte) (int,error) {
    return rwc.stream.Read(p)
}

// Write like in io.Writer
func (rwc *NetReaderWriter) Write(p []byte) (int,error) {
    k,err := rwc.stream.Write(p)
    // <== flush here,but how???
    return k,err
}

// Close like in io.Closer - this closes both the reader and writer.
func (rwc *NetReaderWriter) Close() error {
    err := rwc.stream.Close()
    if err != nil {
        return fmt.Errorf("unable to close network stream: %v",err)
    }
    return nil
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...