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

huangapple go评论120阅读模式
英文:

Server in Go, redirection to stdout

问题

如何在Go中实现一个服务器,将每个传入的行发送到标准输出?

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "net"
  6. "bufio"
  7. )
  8. func main() {
  9. srv, err := net.Listen("tcp", ":2000")
  10. if err != nil {
  11. log.Fatal(err)
  12. }
  13. for {
  14. conn, err := srv.Accept()
  15. if err != nil {
  16. log.Fatal(err)
  17. }
  18. go func(c net.Conn) {
  19. defer c.Close()
  20. reader := bufio.NewReader(c)
  21. for {
  22. line, err := reader.ReadString('\n')
  23. if err != nil {
  24. if err == io.EOF {
  25. break
  26. }
  27. log.Println(err)
  28. break
  29. }
  30. log.Println(line)
  31. }
  32. }(conn)
  33. }
  34. }
英文:

How I can implement a server in Go, which sends each incomming line to stdout ?

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "net"
  6. )
  7. func main() {
  8. srv, err := net.Listen("tcp", ":2000")
  9. for {
  10. conn, err := srv.Accept()
  11. go func(c net.Conn) {
  12. //How to split here by lines ?
  13. c.Close()
  14. }(conn)
  15. }
  16. }

After runing the server with

  1. ./server

And running telnet

  1. telnet localhost 2000
  2. Trying 127.0.0.1...
  3. Connected to localhost.
  4. Escape character is '^]'.
  5. test 123
  6. foobar

I want to see on stdout where I started the server:

  1. test 123
  2. foobar

I know this code lacks error handling, but this is only for clearity to show what I'm trying to do.

答案1

得分: 7

由于net.Conn是一个io.Reader,您可以将其包装在一个bufio.Reader中,并在该类型上使用ReadString方法。您的函数将变为

  1. func(c net.Conn) {
  2. f := bufio.NewReader(c)
  3. for {
  4. ln, err := f.ReadString('\n')
  5. if err == io.EOF {
  6. break
  7. } else if err != nil {
  8. panic(err)
  9. }
  10. fmt.Print(ln)
  11. }
  12. c.Close()
  13. }

(我不确定Go中的stdout是否同步;在一个单独的goroutine中循环遍历共享通道上的行可能更清晰。)

英文:

Since a net.Conn is an io.Reader, you can wrap it in a bufio.Reader and use the ReadString method on that type. Your function would become

  1. func(c net.Conn) {
  2. f := bufio.NewReader(c)
  3. for {
  4. ln, err := f.ReadString('\n')
  5. if err == io.EOF {
  6. break
  7. } else if err != nil {
  8. panic(err)
  9. }
  10. fmt.Print(ln)
  11. }
  12. c.Close()
  13. }

(I'm not sure if stdout is synchronized in Go; it might be cleaner to send the lines on a shared channel that is looped over in a separate goroutine.)

答案2

得分: 5

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

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "net"
  6. "os"
  7. )
  8. func main() {
  9. srv, err := net.Listen("tcp", ":2000")
  10. if err != nil {
  11. log.Fatalf("Error listening: %v", err)
  12. }
  13. for {
  14. conn, err := srv.Accept()
  15. if err != nil {
  16. log.Fatalf("Error accepting: %v", err)
  17. }
  18. go func(c net.Conn) {
  19. defer c.Close()
  20. io.Copy(os.Stdout, c)
  21. }(conn)
  22. }
  23. }
英文:

If that's all you want, just copy the socket to stdout.

  1. package main
  2. import (
  3. "io"
  4. "log"
  5. "net"
  6. "os"
  7. )
  8. func main() {
  9. srv, err := net.Listen("tcp", ":2000")
  10. if err != nil {
  11. log.Fatalf("Error listening: %v", err)
  12. }
  13. for {
  14. conn, err := srv.Accept()
  15. if err != nil {
  16. log.Fatalf("Error accepting: %v", err)
  17. }
  18. go func(c net.Conn) {
  19. defer c.Close()
  20. io.Copy(os.Stdout, c)
  21. }(conn)
  22. }
  23. }

huangapple
  • 本文由 发表于 2012年12月29日 21:17:56
  • 转载请务必保留本文链接:https://go.coder-hub.com/14082063.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定