1. 程式人生 > >網路通訊3:TCP互動通訊

網路通訊3:TCP互動通訊

服務端實現

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("連線已斷開")
}