1. 程式人生 > >[Golang] 從零開始寫Socket Server(1): Socket-Client框架

[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一下~