1. 程式人生 > 實用技巧 >簡單TCP伺服器和TCP客戶端原始碼(Golang)

簡單TCP伺服器和TCP客戶端原始碼(Golang)

以下程式碼為服務端,非最終版程式碼,服務端可以接受多個客戶端的請求,且所有訊息會顯示在服務端上,服務端無法傳送訊息:

package main

import (
    "fmt"
    "net"
)

// HandleConn 是一個協程,併發處理請求,讀取使用者輸入。
func HandleConn(conn net.Conn) {
    address := conn.RemoteAddr().String()
    fmt.Println("接收到請求,來中:", address)
    conn.Write([]byte(conn.RemoteAddr().String() + "加入聊天室。"))
    buf := make([]byte, 1024)
    for {
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println("err", err)
            return
        }
        fmt.Println(string(buf[:n]))
        if string(buf[:n]) == "exit" {
            fmt.Println(address, "已退出聊天室。")
            return
        }
        // 可以實現自動回覆訊息,將收到的訊息中的字母轉換為大寫後傳送出去,去掉註釋即可。
        // conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
}

func main() {
    listen, err := net.Listen("tcp", "127.0.0.1:8888")
    defer listen.Close()
    fmt.Println("Listening on ", listen.Addr().String())
    if err != nil {
        fmt.Println("err:", err)
        return
    }
    for {
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println("err", err)
            return
        }
        go HandleConn(conn)
    }
}

  以下程式碼為客戶端程式碼,輸入exit即可斷開與伺服器的連線:

package main

import (
	"fmt"
	"net"
)

func main() {
	conn, err := net.Dial("tcp", "127.0.0.1:8888")
	go HandleRead(conn)
	if err != nil {
		fmt.Println("err=", err)
	}
	defer conn.Close()
	var abc string
	for {
		fmt.Scanln(&abc)
		conn.Write([]byte(abc))
		if abc == "exit" {
			fmt.Println("正在退出......")
			return
		}
	}

}

// HandleRead 用來閱讀伺服器傳送的資料
func HandleRead(conn net.Conn) {
	buf := make([]byte, 1024)
	for {
		n, err := conn.Read(buf)
		if err != nil {
			fmt.Println("err:", err)
			return
		}
		fmt.Println(string(buf[:n]))
	}
}