初始代碼沒有加註釋,初始代碼只能跑一次。往下拉就會有代碼註釋 慢慢看哈。本文提供的源碼均可以直接執行緩存
1 tcp初始服務端代碼
package main import ( "fmt" "net" "os" ) func TcpError(err error, when string) { if err != nil { fmt.Println("錯誤地址,err", when, err) // 非正常退出,正常退出爲0 os.Exit(0) } } func ioWithConn(conn net.Conn) { buffer := make([]byte, 1024) n, err := conn.Read(buffer) TcpError(err, "conn.Read") clientMsg := string(buffer[:n]) fmt.Println("收到客戶端消息", clientMsg) conn.Write([]byte("msg receive" + clientMsg)) } func main() { // 監聽tcp鏈接 listener, err := net.Listen("tcp", "127.0.0.1:8080") TcpError(err, "net.Listen") conn, err := listener.Accept() TcpError(err, "listener.Accept") ioWithConn(conn) }
2 tcp初始客戶端代碼
package main import ( "bufio" "fmt" "net" "os" ) func tcpError(err error, when string) { if err != nil { fmt.Println("錯誤地址,err", when, err) // 非正常退出,正常退出爲0 os.Exit(0) } } func main() { // 直接撥號鏈接 conn, err := net.Dial("tcp", "127.0.0.1:8080") tcpError(err, "net.Dial") reader := bufio.NewReader(os.Stdin) lineBytes, _, _ := reader.ReadLine() conn.Write(lineBytes) buffer := make([]byte, 1024) n, _ := conn.Read(buffer) serverMsg := string(buffer[:n]) fmt.Println("server", serverMsg) }
3 初始執行結果
4. 多客戶端對一個服務端
服務端微信
package main import ( "fmt" "net" "os" ) func TcpError(err error, when string) { if err != nil { fmt.Println("錯誤地址,err", when, err) // 非正常退出,正常退出爲0 os.Exit(0) } } func ioWithConn(conn net.Conn) { // 開闢一個緩衝區 buffer := make([]byte, 1024) // 關閉鏈接 defer conn.Close() for { // 讀取數據 n, err := conn.Read(buffer) // 驗證 TcpError(err, "conn.Read") // 把讀取的數據放到緩存區中 clientMsg := string(buffer[:n]) fmt.Println("收到客戶端消息", clientMsg) // 若是客戶端輸入的是 im off if clientMsg == "im off" { // 服務端往鏈接寫一個bye conn.Write([]byte("bye")) break } // 服務端回覆客戶端的信息 conn.Write([]byte("msg receive" + clientMsg)) } fmt.Println("用戶斷開鏈接") } func main() { // 監聽tcp鏈接 listener, err := net.Listen("tcp", "127.0.0.1:8080") // 驗證錯誤 TcpError(err, "net.Listen") // 服務端一鏈接就會出現listener... fmt.Println("listener...") for { // 新的客戶端鏈接 conn, err := listener.Accept() // 驗證鏈接 TcpError(err, "listener.Accept") // 處理每個客戶端 go ioWithConn(conn) } }
客戶端tcp
package main import ( "bufio" "fmt" "net" "os" ) func tcpError(err error, when string) { if err != nil { fmt.Println("錯誤地址,err", when, err) // 非正常退出,正常退出爲0 os.Exit(0) } } func main() { // 直接撥號鏈接 conn, err := net.Dial("tcp", "127.0.0.1:8080") tcpError(err, "net.Dial") // 讀取鍵盤輸入 reader := bufio.NewReader(os.Stdin) // 建立緩衝區 buffer := make([]byte, 1024) for { // 每次讀取一行 lineBytes, _, _ := reader.ReadLine() // 輸入寫入字符串 conn.Write(lineBytes) // 讀取緩衝區的數據(這塊是服務端寫的,這裏就能夠直接拿出來) n, _ := conn.Read(buffer) // 把字節轉爲字符串 serverMsg := string(buffer[:n]) fmt.Println("server", serverMsg) if serverMsg == "bye" { break } } fmt.Println("客戶端如下線") }