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


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

在鏈接中,要循環的去讀取客戶端傳遞過來的數據,這樣就能夠不停的處理客戶端的請求數據
在讀取數據的時候,每次我只讀一個字節,這樣方便查看接收到什麼數據,所以讀取數據的時候也要循環,拼接收到的數據,在這個循環中若是讀取大小爲0或者讀取的這個字節爲\n時,我就退出循環。app

由於\n的ascii編碼爲10,因此我收到的這一個字節切片的數據tmpByte[0]爲10的時候就斷掉tcp

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

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

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

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

完整代碼:ci

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))
    }
}

 

相關文章
相關標籤/搜索