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