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 mainimport ( "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 =https://www.cnblogs.com/taoshihan/p/ append(resData, tmpByte...) } str := fmt.Sprintf("收到:%s\n", string(resData)) conn.Write([]byte(str)) }}

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/63365.html
標籤:Go
上一篇:【leetcode】127. Word Ladder
下一篇:GO語言介紹以及開發環境配置
