go tcp連線 在Go中構建併發TCP伺服器樣例

2021-10-17 09:37:52 字數 3501 閱讀 9658

開發乙個併發tcp伺服器,只使用大約65行go**生成隨機數。

tcp和udp伺服器無處不在,通過tcp / ip網路為網路客戶端提供服務。在本文中,我將解釋如何使用go程式語言開發乙個返回隨機數的併發tcp伺服器。對於來自tcp客戶端的每個傳入連線,tcp伺服器將啟動乙個新的goroutine來處理該請求。

你可以在github上找到這個專案,conctcp.go。

該程式的邏輯可以在handleconnection()函式的go**中找到,其實現如下:

func handleconnection(c net.conn) 

temp := strings.trimspace(string(netdata))

if temp == "stop"

result := strconv.itoa(random()) + "n"

c.write(byte(string(result)))

}c.close()

}

程式設計和開發

如果tcp客戶端傳送「stop」字串,則服務該特定tcp客戶端的goroutine將終止;否則,tcp伺服器會將隨機數傳送回tcp客戶端。for只要tcp客戶端需要,迴圈就確保tcp客戶端將被服務。for迴圈中的go**逐行讀取來自tcp客戶端的資料,使用bufio.newreader(c).readstring('n')並使用發回資料c.write(byte(string(result)))。(您可能會發現淨標準go包文件很有幫助。)

main()函式的實現告訴tcp伺服器每次必須為tcp客戶端提供服務時都要啟動乙個新的goroutine:

func main() 

port := ":" + arguments[1]

l, err := net.listen("tcp4", port)

if err != nil

defer l.close()

rand.seed(time.now().unix())

for

go handleconnection(c)}}

首先,main()確保程式至少有乙個命令列引數。請注意,現有**不會檢查給定的命令列引數是否是有效的tcp埠號。但是,如果給定值不是有效的tcp埠號,則呼叫net.listen()將失敗,並顯示類似於以下內容的錯誤訊息:

$ go run conctcp.go 12a

listen tcp4: lookup tcp4/12a: nodename nor servname provided, or not known

$ go run conctcp.go -10

listen tcp4: address -10: invalid port

net.listen()呼叫用於告知go程式接受網路連線,從而充當伺服器。返回值net.listen()net.conn型別,它實現了io.readerio.writer介面。該main()函式還呼叫該rand.seed()函式以初始化隨機數生成器。最後,for迴圈允許程式繼續使用accept()將由handleconnection()函式例項處理的新tcp客戶端,這些例項作為goroutines執行。

net.listen()函式的第乙個引數定義將使用的網路型別,而第二個引數定義伺服器位址以及伺服器將偵聽的埠號。第乙個引數的有效值為tcp,tcp4(僅限ipv4),tcp6(僅限ipv6),udp,udp4(僅限ipv4),udp6(僅限ipv6),ip,ip4(僅限ipv4),ip6(僅限ipv6),unix(unix套接字),unixgram和unixpacket。

conctcp.go需要乙個命令列引數,它是它將偵聽的埠號。在為tcp客戶端提供服務時,您將從conctcp.go獲得的輸出類似於以下內容:

$ go run conctcp.go 8001

serving 127.0.0.1:62554

serving 127.0.0.1:62556

$ netstat -anp tcp | grep 8001

tcp4 0 0 127.0.0.1.8001 127.0.0.1.62556 established

tcp4 0 0 127.0.0.1.62556 127.0.0.1.8001 established

tcp4 0 0 127.0.0.1.8001 127.0.0.1.62554 established

tcp4 0 0 127.0.0.1.62554 127.0.0.1.8001 established

tcp4 0 0 *.8001 *.* listen

上乙個命令的輸出的最後一行通知我們有乙個程序偵聽埠8001,這意味著您仍然可以連線到tcp埠8001.前兩行驗證是否存在已建立的tcp網路連線使用類似地,第三和第四行驗證存在使用埠號8001和62554的另乙個已建立的tcp連線。

此圖顯示了為多個tcp客戶端提供服務時conctcp.go的輸出:

tcp功能於go_server.png

conctcp.go tcp伺服器正在執行。

類似地,下圖顯示了使用該nc(1)實用程式實現的兩個tcp客戶端的輸出:

tcp功能於go_client.png

使用該nc(1)實用程式作為tcp客戶端來conctcp.go。

你可以找到更多的資訊nc(1),這也叫netcat(1),在維基百科上。

所以,您剛剛學會了如何使用大約65行go**開發乙個生成隨機數的併發tcp伺服器,這非常令人印象深刻!如果您希望tcp伺服器執行不同的工作,只需更改該handleconnection()功能的實現。

快速構建MMO伺服器框架(七)高併發TCP網路框架

忙活了乙個多星期,差不多把基於tcp的高併發連線網路架構測試穩定了。目的 利用多執行緒把網路連線及資料報壓縮 解壓 加密 解密等等耗時的操作分流 asio對這些沒有原生的支援 順帶提供執行緒池框架。只對遊戲邏輯層暴露出單執行緒的外觀,隔離底層多執行緒的複雜度。結構如下圖 未遵循什麼標準,將就著看吧 ...

php中連線tcp服務的三種方式

首先需要現有乙個 tcp 服務,我們使用 php中的 socket 系列函式實現 建立socket套接字 socket socket create af inet sock stream sol tcp 設定阻塞模式 socket set block socket 為套接字繫結ip和埠 socket...

php中連線tcp服務的三種方式

首先需要現有乙個 tcp 服務,我們使用 php中的 socket 系列函式實現 建立socket套接字 socket socket create af inet,sock stream,sol tcp 設定阻塞模式 socket set block socket 為套接字繫結ip和埠 socket...