【问题标题】:Creating a TCP client in golang在 golang 中创建 TCP 客户端
【发布时间】:2014-06-02 03:34:15
【问题描述】:

您好,我正在尝试学习一些 golang 中的套接字编程,我正在学习本教程

http://synflood.at/tmp/golang-slides/mrmcd2012.html#1

这是一页教程的最终结果。 https://github.com/akrennmair/telnet-chat/blob/master/03_chat/chat.go

我对如何编写这个程序的客户端感到困惑,我创建了一个连接并拨入与服务器运行相同的端口/IP,但我不知道从那里开始。我有新创建的连接的 read() 和 write() 函数,但不知道在哪里分隔读取或任何东西。考虑到文本输入是在服务器中处理的,我想我只需要进行某种读取?

package main

import (
    "bufio"
    "fmt"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:6000")
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    for {
        fmt.Println(bufio.NewReader(conn).ReadString([]byte("\n")))
    }

}

【问题讨论】:

  • TCP 是一种点对点协议,它没有客户端或服务器。客户端/服务器概念是一个与 TCP 无关的应用概念。

标签: sockets networking tcp go client


【解决方案1】:

bufio.NewReader 应该只使用一次,在你的情况下,就在for 之前。例如connbuf := bufio.NewReader(conn)。然后你可以在 connbuf 上使用 ReadString,它会返回字符串并且可能会返回一个错误。例如:

connbuf := bufio.NewReader(conn)
for{
    str, err := connbuf.ReadString('\n')
    if err != nil {
        break
    }

    if len(str) > 0 {
        fmt.Println(str)
    }
}

我正在检查lenerr,因为ReadString可能会返回数据和错误(连接错误、连接重置等),因此您需要同时检查两者。

【讨论】:

  • 这适用于进入第一个提示,但是当服务器(我假设)执行 bufc.ReadLine() 时,它不允许我输入任何内容。这是我收到Welcome to chat room, What is your nickname?: 的输出,但它挂在这里不允许输入。
  • 是的,当然。它一直在阅读和打印。如果您需要一些交互性,您可以在检测到提示时停止循环,或者使用 goroutines,一个用于读取,另一个用于写入。
  • 如果我明白你想要什么,你可以在建立连接后使用两个 goroutine。一个从服务器读取,只需使用io.Copy(os.Stdout, conn),另一个使用io.Copy(conn, os.Stdin)。这是完全异步的,但应该足够开始了。
【解决方案2】:

如果您想读取所有接收到的数据,这是一个简单的解决方案。

    connbuf := bufio.NewReader(c.m_socket)
    // Read the first byte and set the underlying buffer
    b, _ := connbuf.ReadByte() 
    if connbuf.Buffered() > 0 {
        var msgData []byte
        msgData = append(msgData, b)
        for connbuf.Buffered() > 0 {
            // read byte by byte until the buffered data is not empty
            b, err := connbuf.ReadByte()
            if err == nil {
                msgData = append(msgData, b)
            } else {
                log.Println("-------> unreadable caracter...", b)
            }
        }
        // msgData now contain the buffered data...
    }

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2019-02-07
    • 2017-09-23
    • 2010-09-20
    • 2022-12-03
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多