[Go] tcp服務下的數據傳遞



go中實現一個tcp服務,首先是要監聽端口,接收請求,這個地方會被阻塞等待
當客戶端連接過來,會開一個grountine去處理這條客戶端的tcp連接,因此可以同時處理多條連接

在連接中,要循環的去讀取客戶端傳遞過來的數據,這樣就可以不停的處理客戶端的請求數據
在讀取數據的時候,每次我只讀一個字節,這樣方便查看接收到什么數據,因此讀取數據的時候也要循環,拼接收到的數據,在這個循環中如果讀取大小為0或者讀取的這個字節為\n時,我就退出循環。

因為\n的ascii編碼為10,所以我收到的這一個字節切片的數據tmpByte[0]為10的時候就斷掉

可以通過下面代碼的運行看一下收取到的數據,客戶端傳遞一個英文字符,和傳遞一個中文字符所收取到的具體數據,參照ascii對照表

客戶端傳遞:a
服務端收到:
1 [97] 一個字節,ascii編碼為97,對應 a
1 [13] 一個字節,ascii編碼為13,對應 控制字符CR,歸位鍵
1 [10] 一個字節,ascii編碼為10,對應 控制字符LF,換行鍵

客戶端傳遞:你
服務端收到:
1 [228] 三個字節
1 [189]
1 [160]
1 [13] 下面這倆和上面的意思一樣
1 [10]

ascii編碼下,一個英文字符一個字節,utf8編碼下,一個中文字符三個字節

完整代碼:

package main

import (
    "fmt"
    "net"
)

func main() {
    //監聽端口
    listener, _ := net.Listen("tcp", "0.0.0.0:5921")
    //循環阻塞接收,並發處理同時處理多個連接
    for {
        conn, _ := listener.Accept()
        go handleConn(conn)
    }
}
func handleConn(conn net.Conn) {
    //循環不停的去處理數據
    for {
        tmpByte := make([]byte, 1)
        var resData []byte
        //循環去讀取數據
        for {
            len, _ := conn.Read(tmpByte)
            fmt.Println(len, tmpByte)
            //讀到的長度為0,或者讀取到換行就斷掉
            if len == 0 || tmpByte[0] == 10 {
                break
            }
            //拼接讀到的數據
            resData = append(resData, tmpByte...)

        }
        str := fmt.Sprintf("收到:%s\n", string(resData))
        conn.Write([]byte(str))
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM