Как клиент TCP (golang) знает, когда заканчиваются данные, если сервер TCP (nodejs) отправляет данные без разделителя "\ n" - PullRequest
0 голосов
/ 20 ноября 2018

Моя проблема:

Я пытаюсь прочитать данные, отправленные TCP-сервером (nodejs), но не могу, сервер отправляет данные без прерывания "\ r \n "или" \ n "

Я новичок в Голанге, но я много пытался получить все данные, отправленные сервером.

Код с сервера.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.- Существует стандартный размербуфера в сети (nodejs)?
2.- Как я могу прочитать данные, отправленные сервером в golang без перерыва?(нет проблем с клиентом и сервером в nodejs)
3.- Мне нужно читать побайтно?и найти \ x00 из буфера, отправленного сервером (nodejs)?(если это так, как?)
4.- Сервер и Клиент в nodejs работают с разделителем, но когда они отправляют данные на другой, разделитель на другой стороне удаляется?

У меня есть примеры этого, но никто break the cicle 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 голосов
/ 20 ноября 2018

Речь идет о передаче данных по протоколу TCP, обычно в этом случае вы должны определить протокол для ваших данных, чтобы определить, сколько байтов будет отправлено, и обычно разделитель для конца пакета. например

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

На самом деле ReadLine также использует этот метод, но только с разделителем

...