如果TCP Server(nodejs)发送不带分隔符“ \ n”的数据,TCP Client(golang)如何知道数据何时结束

时间:2018-11-20 06:41:11

标签: node.js go tcp

我的问题:

我正在尝试读取TCP服务器发送的数据(nodejs) 但是我不能,服务器发送的数据没有换行符“ \ r \ n”或“ \ n”

我是Golang的新手,但我一直在尝试很多事情来获取服务器发送的所有数据。

Server.js中的代码,这是一个简单的示例

var net = require('net');

var server = net.createServer(function(socket) {
    console.log("New Client")

    socket.on('data', function(data){
        console.log("data",data,data.toString())
        socket.write("qweqweqkjwebqkjwhbekqjwbekjqbwkejhqwkjehqkwjehkqjwehkqjwhekjqhwekjhqwe")
    })
    socket.on('error', function(error){
        console.error("Error:",error)
    })
});

server.listen(4001, '127.0.0.1');

我来自golang的代码

package main

import (
    "bufio"
    "fmt"
    "io"
    "log"
    "net"
    "time"
)

func main() {
    conn, _ := net.Dial("tcp", "127.0.0.1:4001")

    for {
        fmt.Println("Send Text")
        fmt.Fprintf(conn, "Hello")

        // message, _ := bufio.NewReader(conn).ReadString('\n')
        // message, _ := bufio.NewReader(conn).ReadString('\r')
        message, _, _ := bufio.NewReader(conn).ReadLine() // how i know when data end if server doesn't send separator like "\n" "\r"
        fmt.Println("Message from server: " + message)

        time.Sleep(time.Second * 3)
    }
}

客户端Golang的输出:

Send Text

仅此而已,客户端(golang)正在等待换行

问题

1.- net(nodejs)中的缓冲区有标准大小吗?
2.-如何在没有断线的情况下读取golang中Server发送的数据? (nodejs中的客户端和服务器没有问题)
3.-我需要逐字节读取吗?并从Server(nodejs)发送的缓冲区中找到\ x00? (如果是这种情况,怎么办?)
4.- nodejs中的Server和Client与分隔符一起使用,但是当它们将数据发送到另一个时,在另一边的分隔符被删除了吗?

我已经证明了这个示例,但是没有一个break提示for

reader := bufio.NewReader(conn)
    // for {
    //  time.Sleep(time.Second * 3)
    //  // buff := make([]byte, 4)
    //  test, _ := reader.ReadByte()
    //  fmt.Printf("%q\n", test)
    //  fmt.Printf("%x\n", test)
    // }

    // buf := make([]byte, 1)
    // for {
    //  n, err := reader.Read(buf)
    //  fmt.Println(n, err, buf[:n])
    //  if err == io.EOF {
    //      break
    //  }
    // }

    // buf := make([]byte, 4)
    // if _, err := io.ReadFull(reader, buf); err != nil {
    //  log.Fatal(err)
    // }
    // fmt.Println(string(buf))

    buf, err := ioutil.ReadAll(reader)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(buf))

1 个答案:

答案 0 :(得分:0)

这与TCP数据传输有关,通常在这种情况下,您应该为数据定义一个协议,以定义将发送多少字节,并且通常是数据包结尾的分隔符。例如

[n-Bytes for data lenght][data][separator bytes]

实际上,ReadLine也使用此方法,但仅使用分隔符