網路通訊3:TCP互動通訊
阿新 • • 發佈:2018-12-21
服務端實現
import ( "fmt" "net" "os" "strings" ) func CheckErrorS(err error) { if err != nil { fmt.Println("網路錯誤", err.Error()) os.Exit(1) } } func Processinfo(conn net.Conn) { buffer := make([]byte, 1024) //開創緩衝區 defer conn.Close() //關閉連線 for { n, err := conn.Read(buffer) //讀取資料 CheckErrorS(err) if n != 0 { //拿到客戶端地址 remoteAddr := conn.RemoteAddr() msg := string(buffer[:n]) fmt.Println("收到訊息",msg, "來自", remoteAddr) if strings.Contains(msg,"錢") { conn.Write([]byte("fuckoff")) break } conn.Write([]byte("已閱:"+msg)) } } } func main() { //建立TCP伺服器 listener, err := net.Listen("tcp", "127.0.0.1:8898") CheckErrorS(err) defer listener.Close() //關閉網路 fmt.Println("伺服器正在等待") for { conn, err := listener.Accept() //新的客戶端連線 CheckErrorS(err) //處理每一個客戶端 go Processinfo(conn) } }
客戶端實現
import ( "fmt" "net" "bufio" "os" ) func CheckErrorC(err error) { if err != nil { fmt.Println("網路錯誤", err.Error()) os.Exit(1) } } func MessageSend(conn net.Conn) { var msg string reader := bufio.NewReader(os.Stdin) //讀取鍵盤輸入 for { lineBytes, _, _ := reader.ReadLine() //讀取一行 msg = string(lineBytes) //鍵盤輸入轉化為字串 if msg == "exit" { conn.Close() fmt.Println("客戶端關閉") break } _, err := conn.Write([]byte(msg)) //輸入寫入字串 if err != nil { conn.Close() fmt.Println("客戶端關閉") break } } } func main() { conn, err := net.Dial("tcp", "127.0.0.1:8898") //建立TCP伺服器 CheckErrorC(err) //檢查錯誤 defer conn.Close() //傳送訊息中有阻塞讀取標準輸入的程式碼 //為了避免阻塞住訊息的接收,所以把它獨立的協程中 go MessageSend(conn) buffer := make([]byte, 1024) for { n, err := conn.Read(buffer) CheckErrorC(err) msg := string(buffer[:n]) fmt.Println("收到伺服器訊息", msg) if msg=="fuckoff"{ break } } fmt.Println("連線已斷開") }