[Golang] 從零開始寫Socket Server(1): Socket-Client框架
第一次跑到網際網路公司實習 。。感覺自己進步飛快啊~第一週剛寫了個HTTP伺服器用於微信公共號的點餐系統~ 第二週就直接開始一邊自學GO語言一邊寫用於Socket的伺服器了。。。
因為發現Golang這一塊資料挺少的,接下來我會在Blog裡把整個Server的Coding,還有遇到的坑都記錄下來~
在golang中,網路協議已經被封裝的非常完好了,想要寫一個Socket的Server,我們並不用像其他語言那樣需要為socket、bind、listen、receive等一系列操作頭疼,只要使用Golang中自帶的net包即可很方便的完成連線等操作~
在這裡,給出一個最最基礎的基於Socket的Server的寫法:
package main import ( "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 main
import (
"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中設計一個通訊協議,從而達到自己的一些特殊要求~
我已經把SocketServer系列的程式碼整合到了一起,釋出到了我個人的github上:點選連結, 希望大家有興趣的可以學習star一下~