为了账号安全,请及时绑定邮箱和手机立即绑定

Go中的服务器,重定向到标准输出

Go中的服务器,重定向到标准输出

Go
狐的传说 2021-05-20 10:58:19
我如何在Go中实现服务器,该服务器将每条传入的行发送到stdout?package mainimport (    "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并运行telnettelnet localhost 2000Trying 127.0.0.1...Connected to localhost.Escape character is '^]'.test 123foobar我想在stdout上看到我启动服务器的位置:test 123foobar我知道这段代码缺少错误处理,但这只是为了清楚地表明我要执行的操作。
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

由于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中循环的共享通道上可能会更干净。)


查看完整回答
反对 回复 2021-05-24
?
米脂

TA贡献1836条经验 获得超3个赞

如果仅此而已,只需将套接字复制到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)

    }

}


查看完整回答
反对 回复 2021-05-24
  • 2 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信