go中實現一個tcp服務,首先是要監聽埠,接收請求,這個地方會被阻塞等待當客戶端連接過來,會開一個grountine去處理這條客戶端的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)) } }