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)

    }

}

用以下命令运行服务器后


./server

并运行telnet


telnet localhost 2000

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

test 123

foobar

我想在stdout上看到我启动服务器的位置:


test 123

foobar

我知道这段代码缺少错误处理,但这只是为了清楚地表明我要执行的操作。


狐的传说
浏览 257回答 2
2回答

至尊宝的传说

由于anet.Conn是一个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()}(我不确定stdout是否在Go中同步;将行发送到在单独的goroutine中循环的共享通道上可能会更干净。)

米脂

如果仅此而已,只需将套接字复制到stdout。package mainimport (    "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)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go