Go中的服务器,重定向到stdout

ast*_*nic 2 networking tcp go

我如何在Go中实现一个服务器,它将每个命令行发送到stdout?

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

运行服务器后

./server
Run Code Online (Sandbox Code Playgroud)

并运行telnet

telnet localhost 2000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
test 123
foobar
Run Code Online (Sandbox Code Playgroud)

我想在stdout上看到我启动服务器的地方:

test 123
foobar
Run Code Online (Sandbox Code Playgroud)

我知道这段代码缺少错误处理,但这只是为了清楚地表明我正在尝试做什么.

Fre*_*Foo 7

由于a net.Conn是a io.Reader,您可以将其包装在a中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()
}
Run Code Online (Sandbox Code Playgroud)

(我不确定stdout是否在Go中同步;在一个单独的goroutine中循环的共享通道上发送行可能更干净.)


Dus*_*tin 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)
    }
}
Run Code Online (Sandbox Code Playgroud)