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

时间:2018-01-22 10:56:07

标签: go tcp netcat

所以我需要在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。我怎样才能做到这一点?感谢。

1 个答案:

答案 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"

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