[Golang] 從零開始寫Socket Server(1): Socket-Client架構

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

第一次跑到互連網公司實習 。。感覺自己進步飛快啊~第一周剛寫了個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中設計一個通訊協議,從而達到自己的一些特殊要求~



著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.