Go語言TCP編程【精簡】
看完上一篇【Go語言網(wǎng)絡(luò)編程、TCP(海量用戶即時通訊系統(tǒng))】就很好懂這一篇了
Go語言TCP編程
TCP協(xié)議為傳輸控制協(xié)議,TCP協(xié)議有以下幾個特點:
1. TCP是面向連接的傳輸層協(xié)議;
2. 每條TCP連接只能有兩個端點,每條TCP連接是點到點的通信;
3. TCP提供可靠的交付服務(wù),保證傳送的數(shù)據(jù)無差錯,不丟失,不重要且有序;
4. TCP提供全雙工通信,允許雙方在任何時候都能發(fā)送數(shù)據(jù),為此TCP連接的兩端都設(shè)有發(fā)送緩存和接收緩存,用來臨時存放雙向通信的數(shù)據(jù);
5. TCP是面向字節(jié)流的;
?
發(fā)送緩存用來暫存以下數(shù)據(jù):
① 發(fā)送應(yīng)用程序傳送給發(fā)送方TCP準備發(fā)送的數(shù)據(jù);
② TCP已發(fā)送但尚未收到確認的數(shù)據(jù);
接收緩存用來暫存以下數(shù)據(jù):
① 按序到達但尚未被接收應(yīng)用程序讀取的數(shù)據(jù);
② 不按序到達的數(shù)據(jù);
因為是面向連接的協(xié)議,數(shù)據(jù)像水流一樣傳輸,會存在黏包問題。
?
TCP連接
一個TCP服務(wù)端可以同時連接很多個客戶端,Go語言可以使用go關(guān)鍵字開啟goroutine,每建立一個連接就創(chuàng)建一個goroutine,這樣可以并發(fā)執(zhí)行每一個創(chuàng)建的連接.
tcp服務(wù)端主要的處理流程有:
1.?監(jiān)聽端口;
2.?接收客戶端請求創(chuàng)建tcp連接;
3.?使用go關(guān)鍵字開啟goroutine處理每一個建立的連接,收發(fā)數(shù)據(jù);
4.?關(guān)閉連接;
tcp客戶端主要的處理流程有:
1.?建立與服務(wù)端的連接;
2.?收發(fā)數(shù)據(jù);
3.?關(guān)閉連接;
?
關(guān)于tcp通信一般會使用到bufio,net,strings,os包.
bufio包主要用來做輸入輸出數(shù)據(jù)的緩存,
bufio.NewReader()函數(shù)可以傳遞os.Stdin類型,os.Stdin為標準輸入;
os.NewReader()函數(shù)返回的是一個新的帶有4096 byte大小緩沖區(qū)的Reader結(jié)構(gòu)體指針類型,通過Reader可調(diào)用很多方法,比如ReadString(delim byte) (string,error)可一直從標準輸入中讀取數(shù)據(jù),直到遇到指定的終止符號delim,并且讀取的內(nèi)容會包含當(dāng)前的delim;
net包主要是連接的監(jiān)聽、創(chuàng)建,以及連接數(shù)據(jù)的讀取和寫入(例如tcp,udp等網(wǎng)絡(luò)編程)等相關(guān)工作,tcp服務(wù)端中可以使用一個process()函數(shù)傳遞一個net.Conn類型,即*net.TCPConn類型的變量conn(TCPConn結(jié)構(gòu)體實現(xiàn)了Conn接口),*TCPConn類型可調(diào)用很多方法。可調(diào)用*TCPConn類型的read()方法讀取tcp連接的數(shù)據(jù),然后輸出數(shù)據(jù)即可,服務(wù)端可以使用net.Listen()函數(shù)監(jiān)聽連接,使用Accept()方法建立tcp連接,客戶端則可以使用net.Dial()連接創(chuàng)建的tcp連接,使用conn接口的實現(xiàn)*TCPConn(Dial()方法的返回值就是*TCPConn類型)調(diào)用conn的read()方法將讀取tcp連接的內(nèi)容,write()方法將數(shù)據(jù)寫入到tcp連接中;strings包主要是對讀取到的數(shù)據(jù)的字符串形式進行處理,比如去除掉字符串的一些符號等等。