TCP连接发现的一些问题

写了一段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")
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容