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

2.21 網路通訊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("連線已斷開")
}