在golang中创建TCP客户端

use*_*984 10 sockets networking client tcp go

嗨,我试图在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")))
    }

}
Run Code Online (Sandbox Code Playgroud)

sir*_*nga 10

bufio.NewReader在你的情况下,应该只使用一次for.例如connbuf := bufio.NewReader(conn).然后你可以在connbuf上使用ReadString,它返回字符串,也许是一个错误.例如:

connbuf := bufio.NewReader(conn)
for{
    str, err := connbuf.ReadString('\n')
    if len(str)>0 {
        fmt.Println(str)
    }
    if err!= nil {
        break
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我理解你想要的东西,你可以在建立连接后使用两个goroutine.一个从服务器读取,只需使用`io.Copy(os.Stdout,conn)`和其他方向使用`io.Copy(conn,os.Stdin)`.这是完全异步的,但它应该足以开始. (2认同)