所以我需要在Go中编写一个服务器来打印来自以下命令的消息:
echo "MESSAGE" | nc localhost 8080
只需打印" MESSAGE"作为stdout上的字符串。我不能使用别的东西,它必须是这个命令。这就是我到目前为止所做的:
package main
import (
"fmt"
"net"
"os"
)
func main() {
ln, err := net.Listen("tcp", ":8080")
check(err)
for {
conn, err := ln.Accept()
check(err)
go handleConnection(conn)
}
}
func handleConnection(conn net.Conn) {
buf := make([]byte, 1024)
reqLen, err := conn.Read(buf)
fmt.Println(reqLen)
check(err)
// PRINT MESSAGE HERE
conn.Write([]byte("Message received."))
fmt.Println(conn.RemoteAddr().String())
conn.Close()
}
func check(err error) {
if err != nil {
fmt.Println("Error:" + err.Error())
os.Exit(1)
}
}
我需要一个fmt.Println(???)其中的评论// PRINT MESSAGE HERE。我怎样才能做到这一点?感谢。
答案 0 :(得分:2)
要在引号中打印消息,您可以使用%q
格式说明符(请参阅fmt docs)。
您需要将缓冲区转换为字符串,并确保只使用包含数据的缓冲区部分(最多reqLen
):
// buf[:reqLen] is a slice of the first reqLen bytes of buf.
// string(...) creates a string from a slice of bytes.
fmt.Printf("Message contents: %q\n", string(buf[:reqLen]))
这将打印:
Message contents: "message\n"
\n
由echo
插入。如果您不想要它,请运行echo -n ...
,或使用strings.TrimSpace去除周围的空格/换行符。