這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
第一次跑到互連網公司實習 。。感覺自己進步飛快啊~第一周剛寫了個HTTP伺服器用於公用號的點餐系統~ 第二周就直接開始一邊自學GO語言一邊寫用於Socket的伺服器了。。。
因為發現Golang這一塊資料挺少的,接下來我會在Blog裡把整個Server的Coding,還有遇到的坑都記錄下來~
在golang中,網路通訊協定已經被封裝的非常完好了,想要寫一個Socket的Server,我們並不用像其他語言那樣需要為socket、bind、listen、receive等一系列操作頭疼,只要使用Golang中內建的net包即可很方便的完成串連等操作~
在這裡,給出一個最最基礎的基於Socket的Server的寫法:
package mainimport ("fmt""net""log""os")func main() {//建立socket,監聽連接埠netListen, err := net.Listen("tcp", "localhost:1024")CheckError(err)defer netListen.Close()Log("Waiting for clients")for {conn, err := netListen.Accept()if err != nil {continue}Log(conn.RemoteAddr().String(), " tcp connect success")handleConnection(conn)}}//處理串連func handleConnection(conn net.Conn) {buffer := make([]byte, 2048)for {n, err := conn.Read(buffer)if err != nil {Log(conn.RemoteAddr().String(), " connection error: ", err)return}Log(conn.RemoteAddr().String(), "receive data string:\n", string(buffer[:n]))}}func Log(v ...interface{}) {log.Println(v...)}func CheckError(err error) {if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}}
唔,拋除Go語言裡面10行代碼有5行error的蛋疼之處,你可以看到,Server想要建立並接受一個Socket,其核心流程就是
netListen, err := net.Listen("tcp", "localhost:1024")
conn, err := netListen.Accept()
n, err := conn.Read(buffer)
這三步,通過Listen、Accept 和Read,我們就成功的綁定了一個連接埠,並能夠讀取從該連接埠傳來的內容~
Server寫好之後,接下來就是Client方面啦,我手寫一個HelloWorld給大家:
package mainimport ("fmt""net""os")func sender(conn net.Conn) {words := "hello world!"conn.Write([]byte(words))fmt.Println("send over")}func main() {server := "127.0.0.1:1024"tcpAddr, err := net.ResolveTCPAddr("tcp4", server)if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}conn, err := net.DialTCP("tcp", nil, tcpAddr)if err != nil {fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())os.Exit(1)}fmt.Println("connect success")sender(conn)}
可以看到,Client這裡的關鍵在於
tcpAddr, err := net.ResolveTCPAddr("tcp4", server)
conn, err := net.DialTCP("tcp", nil, tcpAddr)
這兩步,主要是負責解析連接埠和串連~
寫好Server和Client之後,讓我們運行一下看看:~~
成功運行,Console出現Server等待串連的提示:
然後我們運行Client:
成功串連Server啦,讓我們看看Server那邊的成果:
Server端成功的收到了我們的Hello-World啦,至於後面的那行紅字,則是中斷連線的提示~
到這裡,一個最基礎的使用Socket的Server-Client架構就出來啦~
如果想要讓Server能夠響應來自不同Client的請求,我們只要在Server端的代碼的main入口中,
在 handleConnection(conn net.Conn) 這句代碼的前面加上一個 go,就可以讓伺服器並發處理不同的Client發來的請求啦
關於Golang的並發處理,可以參考這裡 Golang並行計算
下一篇,我會寫一下如何在Server和Client中設計一個通訊協議,從而達到自己的一些特殊要求~
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。