簡單TCP伺服器和TCP客戶端原始碼(Golang)
阿新 • • 發佈:2020-10-11
以下程式碼為服務端,非最終版程式碼,服務端可以接受多個客戶端的請求,且所有訊息會顯示在服務端上,服務端無法傳送訊息:
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])) } }