写了一段demo测试tcp的连接,发现了一点问题,不知道这算不算是Cmder的一个bug,代码如下:
func main() {
fmt.Println("Main Func")
// 开始监听端口
listener, err := net.Listen("tcp", ":8080")
if err != nil {
fmt.Println("Error Listening:", err.Error())
}
defer listener.Close()
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println("Error Accept:", err.Error())
continue
}
go handleClient(conn)
}
}
func handleClient(conn net.Conn) {
defer conn.Close()
// 为每个客户端连接创建一个新的读写器
reader := bufio.NewReader(conn)
writer := bufio.NewWriter(conn)
for {
// 读取客户端发送的数据
data, err := reader.ReadString('\n')
if err != nil {
fmt.Println("Error reading:", err)
return
}
// 打印接收到的数据
// print_list(data)
fmt.Println("Received(Byte):", []byte(data))
fmt.Println("Received(String):", data)
// 回射数据给客户端
_, err = writer.WriteString(data)
if err != nil {
fmt.Println("Error writing:", err)
return
}
writer.Flush() // 确保数据被写入到连接中
}
}
很简单的一个功能,用代码监听本地的8080端口,然后开启一个协程,收到什么就返回什么,我这边使用的是cmder
的telnet命令进行测试的
telnet 127.0.0.1 8080
输入命令后,会显示连接上了的信息,然后可以给服务端发送数据,但是我这边输入222
,打印出来的结果却是
Received(Byte): [13 0 50 50 50 10]
百思不得其解,为什么回车换行还有这个空字符都出来了,而且排列方式很诡异,后来我用windows的telnet去测试,就很正常,结果是
Received(Byte): [49 49 49 13 10]
Received(String): 111
GPT的解释:
\r:
在 ASCII 控制字符中,\r 表示回车(Carriage Return),ASCII 码为 13。
在早期的打字机和电传打字机中,回车指令会使打印头回到左边缘,但不会移动到下一行。
在文本文件中,\r 通常与 \n 一起使用,表示换行符,即回到行首。
\n:
在 ASCII 控制字符中,\n 表示换行(Newline),ASCII 码为 10。
在文本文件中,\n 通常用于表示换行符,即移动到下一行的行首。
在 Unix/Linux 等操作系统中,通常使用 \n 作为换行符。
在 Windows 中,换行通常是由 \r\n 组成的,即回车加换行。
所以正常在windows系统接收到的值应该是 字符串 + \r\n
,在Linux系统接收到的值应该是字符串 + \n
,我不懂为什么使用cmder
接收到的数据是那个样子的,差点让我怀疑代码了
strings.Trim
顺带说一下Golang中的trim函数
func TrimRight(s string, cutset string) string:
TrimRight 方法用于去除字符串 s 结尾处匹配 cutset 中任何字符的部分,并返回修剪后的字符串。
package main
import (
"fmt"
"strings"
)
func main() {
s := []byte{13, 0, 50, 50, 50, 10}
temp := strings.TrimRight(string(s), "\r\n")
fmt.Println([]byte(temp))
s2 := "12345"
temp2 := strings.TrimRight(s2, "15")
fmt.Println(temp2)
}
执行结果是
[13 0 50 50 50]
1234
所以相当于是在结尾处判断是否有cutset 中任何字符的部分,只要有一个也会被trim掉,之前一直以为必须是以“15”结尾才会被trim掉,还有以下几种情况
// 输出 123
temp2 := strings.TrimRight(s2, "45")
// 输出 1234
temp2 := strings.TrimRight(s2, "35")
网友评论