【问题标题】:Server in Go, redirection to stdoutGo中的服务器,重定向到标准输出
【发布时间】:2012-12-14 11:02:09
【问题描述】:

我如何在 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

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

【问题讨论】:

    标签: networking tcp go


    【解决方案1】:

    由于net.Connio.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 中同步;将行发送到共享通道上可能会更干净,该通道在单独的 goroutine 中循环。)

    【讨论】:

      【解决方案2】:

      如果这就是你想要的,只需将套接字复制到标准输出。

      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)
          }
      }
      

      【讨论】:

      • 请注意,这看起来比你的要大一些,因为我还添加了一些错误处理(虽然不是在 io.Copy 失败案例中)
      猜你喜欢
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 2014-01-20
      • 2011-12-08
      相关资源
      最近更新 更多