如何在Go TCP服务器中打印netcat发送的TCP消息?
解决Go服务器读取nc发送消息并打印的问题
这问题很容易搞定!要实现你要的功能,只需要把读取到的字节数据转换成字符串,再处理掉echo默认添加的换行符即可。具体步骤如下:
1. 导入必要的包
首先需要在导入部分添加strings包,用来处理字符串的空白字符:
import ( "fmt" "net" "os" "strings" // 新增这个包 )
2. 处理并打印消息
在// PRINT MESSAGE HERE的位置,添加以下代码:
// PRINT MESSAGE HERE message := strings.TrimSpace(string(buf[:reqLen])) fmt.Println(message)
代码解释:
buf[:reqLen]:conn.Read()返回的reqLen是实际读取到的字节数,我们只取数组中有效的这部分数据,避免读取到buf中未初始化的空字节。string(...):把字节数组转换成字符串类型。strings.TrimSpace(...):去掉字符串首尾的空白字符(包括echo命令默认添加的换行符\n),这样就能得到干净的MESSAGE内容。
修改后的完整代码
package main import ( "fmt" "net" "os" "strings" ) 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) check(err) // 先检查错误再处理数据,避免err非nil时reqLen无效 // PRINT MESSAGE HERE message := strings.TrimSpace(string(buf[:reqLen])) fmt.Println(message) 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) } }
额外提示
我注意到你原来的代码里先打印reqLen再检查err,这其实有风险——如果conn.Read()返回错误(比如连接中断),reqLen的值可能无效,所以建议先调用check(err)再处理读取到的数据,就像上面修改后的代码那样。
现在你运行服务器,再执行echo "Hello Go" | nc localhost 8080,就能在服务器的标准输出看到Hello Go啦!
内容的提问来源于stack exchange,提问作者maverigz
相关产品推荐
相关产品推荐

