這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一、概述
上一篇介紹了基本的函數和結構類型,這裡就可以開始寫服務端和用戶端通訊小程式了,通訊的基本的流程如下:
如果服務端使用Listen
來監聽,那麼可以不用ResolveTCPAddr
函數。
現在我們就來寫一個server和client,實現功能:client發送資料到server,server將資料轉成大寫後返回。
二、服務端實現
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
package main import ( "net" "fmt" "strings" ) func main(){ tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //建立一個TCPAddr if err != nil{ fmt.Println(err) return } tcpLinstener, err := net.ListenTCP("tcp4", tcpAddr) //開始監聽 if err != nil{ fmt.Println(err) return } fmt.Printf("Start listen:[%s]", tcpAddr) tcpCoon, err := tcpLinstener.AcceptTCP() //阻塞,等待用戶端串連 if err != nil{ fmt.Println(err) return } defer tcpCoon.Close() //記得關閉連線物件 data := make([]byte, 2048) n, err := tcpCoon.Read(data) //用戶端串連後,開始讀取資料 if err != nil{ fmt.Println(err) return } recvStr := string(data[:n]) fmt.Println("Recv:", recvStr) tcpCoon.Write([]byte(strings.ToUpper(recvStr))) //轉換成大寫後返回用戶端 }
|
開啟服務端,進入監聽狀態等待用戶端串連:
三、用戶端實現
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
package main import ( "net" "fmt" ) func main(){ tcpAddr, err := net.ResolveTCPAddr("tcp4", "localhost:8080") //TCP串連地址 if err != nil{ fmt.Println(err) return } tcpCoon, err := net.DialTCP("tcp4", nil, tcpAddr) //建立串連 if err != nil{ fmt.Println(err) return } defer tcpCoon.Close() //關閉 sendData := "helloworld" n, err := tcpCoon.Write([]byte(sendData)) //發送資料 if err != nil{ fmt.Println(err) return } fmt.Printf("Send %d byte data success: %s", n, sendData) recvData := make([]byte, 2048) n, err = tcpCoon.Read(recvData) //讀取資料 if err != nil{ fmt.Println(err) return } recvStr := string(recvData[:n]) fmt.Printf("Response data: %s", recvStr)
|
運行用戶端,服務端將會響應用戶端請求:
服務端狀態如下:
至此,一個完成的server和clinet就完成了