Json 在使用原始tcp时,有什么好方法可以确保整个消息的传递?

Json 在使用原始tcp时,有什么好方法可以确保整个消息的传递?,json,node.js,tcp,go,buffer,Json,Node.js,Tcp,Go,Buffer,假设我有一个应用程序,在后端我想使用原始tcp,这样我就可以在不同的服务之间进行双向通信。在这个应用程序中,我希望通过一个由json对象组成的有效负载进行发送,当发送json数据时,每隔几条消息,它就会被切断,剩下的就被聚集到下一个响应中。我不想使用像websockets这样的东西,因为从http升级需要时间。什么是确保json对象作为整个json对象从一个节点进入另一个节点并从另一个节点读取的最好方法 我知道发送和接收设置大小的缓冲区以及发送一条消息是经验法则,但是我能看一个例子吗?最好是在J

假设我有一个应用程序,在后端我想使用原始tcp,这样我就可以在不同的服务之间进行双向通信。在这个应用程序中,我希望通过一个由json对象组成的有效负载进行发送,当发送json数据时,每隔几条消息,它就会被切断,剩下的就被聚集到下一个响应中。我不想使用像websockets这样的东西,因为从http升级需要时间。什么是确保json对象作为整个json对象从一个节点进入另一个节点并从另一个节点读取的最好方法

我知道发送和接收设置大小的缓冲区以及发送一条消息是经验法则,但是我能看一个例子吗?最好是在Javascript节点的netstdlib或Golang中,它是netstdlib,因为这些是我最精通的语言,尽管我并不真正关心它最终是用什么语言完成的

我知道在确保使用tcp传递消息方面有一些类似的问题,但没有人问我找到的示例


我知道tcp是一个流。我只是想问一种方法,以确保在将特定的json对象写入此流时,如何确保在另一端获得相同的json对象,就像从节点a发送json对象X一样,ok节点b接收到相同的对象X,您不需要心跳或固定大小的消息来进行传递确认。如果需要确保交付,则需要应用程序级别的确认。如果需要确保传递正确的消息,则需要包含一个唯一的消息ID以进行确认。如果需要确保消息未被更改,则需要包含校验和或MAC

在这里,听起来您在消息框架方面遇到了问题。虽然有很多方法可以用简单长度前缀、HTTP/1.1等来框显消息,但一个简单的解决方案是使用内置的json.Encoder和json.Decoder

示例客户端,每秒发送一条PING消息:

type Message struct {
    Payload string
}

func sendMessages(c net.Conn) {
    message := Message{}

    encoder := json.NewEncoder(c)

    for i := 0; ; i++ {
        message.Payload = fmt.Sprintf("PING %d", i)
        err := encoder.Encode(message)
        if err != nil {
            log.Fatal(err)
        }
        time.Sleep(time.Second)
    }
}
示例服务器:

type Message struct {
    Payload string
}

func receiveMessages(c net.Conn) {
    m := Message{}

    decoder := json.NewDecoder(c)
    for {
        err := decoder.Decode(&m)
        if err != nil {
            log.Fatal(err)
        }
        fmt.Printf("Received: %#v\n", m)
    }
}

是的,这是显而易见的。我要求确保所有信息都能收到。有时json会被切断。@ChristianGrabowski:TCP保证按顺序传递,而且由于您正在发送json,因此语法提供了一种检查对象是否完整的方法。您想要一种不用解析json就能确保交付的方法吗?是否要包含签名以确保消息不被更改?我的意思是,当发送json数据时,每隔几条消息,它就会被切断,剩余的会被聚集到下一个响应中。显然,由于某种原因,它在X个paclet上被切断,然后继续运行。@ChristianGrabowski:TCP没有消息,它是一个流。流被分解成数据包,根据读取的时间,您可以在单个操作中读取这些数据包的任何部分,直到读取缓冲区的大小。它没有切断任何东西,你只需要从流中读更多的东西。也就是说,您可以使用一个长度前缀消息协议来帮助读取流,或者类似于json.Encoder/Decoder的东西,它将用换行符分隔多个json对象。也许张贴一个你尝试过的例子,以及哪里出了问题。让我们来看看。