在golang中创建TCP客户端

13

嗨,我想学习一些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无关。 - Ron Maupin
2个回答

12

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() 时,它不允许我输入任何内容。我收到的输出是 欢迎来到聊天室,请问你的昵称是什么?: 但是它卡在这里不允许输入。 - user3324984
1
当然可以。它会一直读取并打印。如果你需要一些交互,你可以在检测到提示时停止循环,或者使用 goroutines,一个用于读取,另一个用于写入。 - siritinga
2
如果我理解你的意思,你可以在连接建立后使用两个goroutine。一个用于从服务器读取,只需使用io.Copy(os.Stdout, conn),另一个用于另一个方向,使用io.Copy(conn, os.Stdin)。这是完全异步的,但应该足以开始。 - siritinga

1

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

    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...
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接