在golang中创建TCP客户端

时间:2014-04-17 18:05:14

标签: sockets networking tcp go client

您好我试图在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")))
    }

}

2 个答案:

答案 0 :(得分: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
    }
}

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

答案 1 :(得分: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...
    }