Golang 中带有 TCP/IP 套接字的通道无法正常工作

Channels in Golang with TCP/IP socket not working

我刚开始为服务器编写 Golang 客户端,我用 C 语言用 TCP/IP 套接字创建了服务器,然后我发现我的频道不工作。

知道为什么吗?

func reader(r io.Reader, channel chan<- []byte) {
  buf := make([]byte, 2048)
  for {
    n, err := r.Read(buf[:])
    if err != nil {
        return
    }
    channel <- buf[0:n]
  }
}
func client(e *gowd.Element) {
 f, err := os.Create("/tmp/dat2")
 if err != nil {
    log.Fatal()
 }
 read := make(chan []byte)
 c, err := net.Dial("tcp", "127.0.0.1:4242")
 if err != nil {
    log.Fatal(err)
 }
 go reader(c, read)
 for {
    buf := <-read
    n := strings.Index(string(buf), "\n")
    if n == -1 {
        continue
 }
 msg := string(buf[0:n])
 if msg == "WELCOME" {
    fmt.Fprint(c, "GRAPHIC\n")
 }
 f.WriteString(msg + "\n")
}

使用 netcat 测试我的服务器会产生以下输出: http://pasted.co/a37b2954

但我只有:http://pasted.co/f13d56b4

我是 Golang 的新手,所以也许我错了(我可能是)

通道使用情况看起来不错,但是从通道中检索值会覆盖先前在 buf := <-read 处读取的值,因为您正在等待换行符。

您也可以使用 bufio.Reader 来读取字符串直到换行符。

您的代码片段不完整,因此无法执行,尝试告诉我:

func reader(r io.Reader, channel chan<- string) {
    bufReader := bufio.NewReader(conn)
    for {
        msg, err := bufReader.ReadString('\n')
        if err != nil { // connection error or connection reset error, etc
           break
        }
        channel <- msg
    }
}

func client(e *gowd.Element) {
    f, err := os.Create("/tmp/dat2")
    if err != nil {
        log.Fatal()
    }
    read := make(chan string)
    c, err := net.Dial("tcp", "127.0.0.1:4242")
    if err != nil {
        log.Fatal(err)
    }
    go reader(c, read)
    for {
        msg := <-read
        if msg == "WELCOME" {
            fmt.Fprint(c, "GRAPHIC\n")
        }
        f.WriteString(msg + "\n")
    }
    //...
}

编辑:

请查找通用 TCP 客户端读取数据的示例。我还从上面的代码片段中删除了扫描仪并添加了缓冲区 reader.

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:4242")
    if err != nil {
        log.Fatal(err)
    }

    reader := bufio.NewReader(conn)
    for {
        msg, err := reader.ReadString('\n')
        if err != nil {
            break
        }
        fmt.Println(msg)
    }
}