web-dev-qa-db-ja.com

golangでTCPクライアントを作成する

こんにちは私はgolangでいくつかのソケットプログラミングを学ぼうとしています、私はこのチュートリアルに従っています

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

これが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")))
    }

}
9
user3324984

_bufio.NewReader_は、あなたの場合、forの直前に1回だけ使用する必要があります。たとえば、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がデータとエラー(接続エラー、接続リセットなど)を返す可能性があるため、両方をチェックする必要があるためです。

10
siritinga

受信したすべてのデータを読み取りたい場合の簡単な解決策は次のとおりです。

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