美文网首页
TCP连接发现的一些问题

TCP连接发现的一些问题

作者: Tauruse | 来源:发表于2024-04-17 17:40 被阅读0次

    写了一段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")
    

    相关文章

      网友评论

          本文标题:TCP连接发现的一些问题

          本文链接:https://www.haomeiwen.com/subject/dvxexjtx.html