2

各着信行を stdout に送信するサーバーを Go に実装するにはどうすればよいですか?

package main

import (
    "io"
    "log"
    "net"
)

func main() {
    srv, err := net.Listen("tcp", ":2000")
    for {
        conn, err := srv.Accept()
        go func(c net.Conn) {

            //How to split here by lines ?

            c.Close()
        }(conn)
    }
}

サーバーを実行した後

./server

そして実行中のtelnet

telnet localhost 2000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
test 123
foobar

サーバーを起動した場所を標準出力で確認したい:

test 123
foobar

このコードにはエラー処理がないことはわかっていますが、これは、私が何をしようとしているのかを明確にするためだけのものです。

4

2 に答える 2

7

anet.Connは であるため、 a でio.Readerラップして、その型でメソッドをbufio.Reader使用できます。ReadStringあなたの機能は

func(c net.Conn) {
    f := bufio.NewReader(c)
    for {
        ln, err := f.ReadString('\n')
        if err == io.EOF {
            break
        } else if err != nil {
            panic(err)
        }
        fmt.Print(ln)
    }
    c.Close()
}

(標準出力がGoで同期されているかどうかはわかりません。別のゴルーチンでループされている共有チャネルで行を送信する方がきれいかもしれません。)

于 2012-12-29T13:35:55.000 に答える
5

それだけの場合は、ソケットをstdoutにコピーするだけです。

package main

import (
    "io"
    "log"
    "net"
    "os"
)

func main() {
    srv, err := net.Listen("tcp", ":2000")
    if err != nil {
        log.Fatalf("Error listening: %v", err)
    }
    for {
        conn, err := srv.Accept()
        if err != nil {
            log.Fatalf("Error accepting: %v", err)
        }
        go func(c net.Conn) {
            defer c.Close()
            io.Copy(os.Stdout, c)
        }(conn)
    }
}
于 2012-12-31T04:06:43.567 に答える