【GO】簡單通訊之TCP

初始代碼沒有加註釋,初始代碼只能跑一次。往下拉就會有代碼註釋 慢慢看哈。本文提供的源碼均可以直接執行緩存

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("客戶端如下線")

}

博主微信歡迎交流

在這裏插入圖片描述