go - 如何在 Go 中从 netcat 打印 TCP 消息?

标签 go tcp netcat

所以我需要用 Go 编写一个服务器来打印来自以下命令的消息:

echo "MESSAGE" | nc localhost 8080

它只需将“MESSAGE”作为字符串打印在标准输出上。我不能使用别的东西,它必须是这个命令。这是我到目前为止所拥有的:

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 所在的位置。我怎样才能做到这一点?谢谢。

最佳答案

要在引号中打印消息,您可以使用 %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"

\necho 插入。如果您不需要它,请运行 echo -n ...,或使用 strings.TrimSpace 去除周围的空白/换行符| .

关于go - 如何在 Go 中从 netcat 打印 TCP 消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379953/

相关文章:

c++ - QtRO - 类 qt 远程对象 - 如何在 TCP 之间连接 2 个或更多远程对等点

bash - 将结果保存到变量

ubuntu - golang snap installation : cgo. a:只读文件系统

go - 如何在 Go 中从键盘输入 ip 地址?

Java TCP 服务器在发送所有行时收到来自客户端的每一行

java - 在Java中获得与Netcat相同的输出

bash - 继续从 tcp 服务器读取数据,直到收到特定消息

io - 程序只打印输入文件的最后一个字符串

json.Unmarshal 返回空白结构

javascript - client.on 没有在单次连接上获取数据