我如何在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)
我知道这段代码缺少错误处理,但这只是为了清楚地表明我正在尝试做什么.
由于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中循环的共享通道上发送行可能更干净.)
如果这就是你想要的,只需将套接字复制到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)