簡單代碼
服務端
//Server.go
package main import ( "fmt"
"net"
"os" ) func main(){ //服務端在本機8888端口建立tcp監聽
listener,err :=net.Listen("tcp","127.0.0.1:8888") ServerHandleError(err,"net.listen") for { //循環接入所有客戶端得到專線連接
conn,e := listener.Accept() ServerHandleError(e,"listener.accept") //開辟獨立協程與該客聊天
go ChatWith(conn) } } func ServerHandleError(err error,when string) { if err != nil { fmt.Println(err, when) os.Exit(1) } } //在conn網絡專線中與客戶端對話
func ChatWith(conn net.Conn){ //創建消息緩沖區
buffer := make([]byte, 1024) for { ///---一個完整的消息回合
//讀取客戶端發來的消息放入緩沖區
n,err := conn.Read(buffer) ServerHandleError(err,"conn.read buffer") //轉化為字符串輸出
clientMsg := string(buffer[0:n]) fmt.Printf("收到消息",conn.RemoteAddr(),clientMsg) //回復客戶端消息
if clientMsg != "im off" { conn.Write([]byte("已讀:"+clientMsg)) } else { conn.Write([]byte("bye")) break } } conn.Close() fmt.Printf("客戶端斷開連接",conn.RemoteAddr()) }
客戶端
//Client.go
package main import ( "bufio"
"fmt"
"net"
"os" ) func ClientHandleError(err error, when string){ if err != nil { fmt.Println(err, when) os.Exit(1) } } func main(){ //撥號遠程地址,簡歷tcp連接
conn, err := net.Dial("tcp","127.0.0.1:8888") ClientHandleError(err, "client conn error") //預先准備消息緩沖區
buffer := make([]byte,1024) //准備命令行標准輸入
reader := bufio.NewReader(os.Stdin) for { lineBytes,_,_ := reader.ReadLine() conn.Write(lineBytes) n,err := conn.Read(buffer) ClientHandleError(err, "client read error") serverMsg := string(buffer[0:n]) fmt.Printf("服務端msg",serverMsg) if serverMsg == "bye" { break } } }
簡單測試
客戶端發消息
服務端讀消息