Создание TCP-клиента в golang

Привет я попытался узнать некоторые сокет программирования в 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() для недавно созданного соединения, но я не знаю, где разграничить чтение или что-то еще. Учитывая, что текстовый ввод handeled на сервере, я полагаю, что мне нужно только сделать какое-то чтение?

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 ответов


bufio.NewReaderследует использовать только один раз, в вашем случае, непосредственно перед for. Например connbuf := bufio.NewReader(conn). Затем вы можете использовать ReadString на connbuf, который возвращает строку и, возможно, ошибку. Например:

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

Я проверяю lenи err, потому что ReadString может возвращать данные и ошибку (ошибка соединения, сброс соединения и т. д.) так что вам нужно проверить оба.


вот простое решение, если вы хотите прочитать все полученные данные.

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