go語言TCP編程入門

服務端

服務端的處理流程

  • 監(jiān)聽端口8888
  • 接收客戶端的tcp連接
  • 創(chuàng)建gorountine,處理該鏈接的請求(通??蛻舳藭ㄟ^鏈接發(fā)送請求包)

客戶端

客戶端的處理流程

  • 建立與服務端的鏈接
  • 發(fā)送請求數(shù)據(jù) (終端),接收服務器端返回的結果數(shù)據(jù)
  • 關閉鏈接

簡單的程序示意圖

服務端與客戶端的關系

服務端功能

  • 編寫一個服務端程序,在8888端口監(jiān)聽
  • 可以和多個客戶端創(chuàng)建鏈接
  • 鏈接成功后,客戶端可以發(fā)送數(shù)據(jù),服務端接收數(shù)據(jù),并且顯示在終端上
  • 先可以使用talnet來測試,然后編寫客戶端程序來測試
package main
import (
    "fmt"
    "io"
    "net"
)
func process(conn net.Conn) {
    defer conn.Close()
    for {
        buf := make([]byte, 1024)
        //等待客戶端通過conn發(fā)送信息
        //如果客戶端沒有Write[發(fā)送],那么協(xié)程就阻塞在這里
        //fmt.Printf("服務器在等待客戶端%s, 發(fā)送信息\n", conn.RemoteAddr().String())
        n, err := conn.Read(buf)
        if err == io.EOF {
            fmt.Println("客戶端退出")
            return
        }
        if err != nil {
            fmt.Println("服務器Read err", err)
            return
        }
        //顯示客戶端發(fā)送的內容到服務器的終端
        fmt.Println(string(buf[:n]))
    }
}

func Server() {
    //Listen函數(shù)創(chuàng)建的服務器
    //頭層皮:網(wǎng)絡協(xié)議
    //127.0.0.1:8888    8888本機ip和端口
    l, err := net.Listen("tcp", "127.0.0.1:8888")
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    defer l.Close()
    //循環(huán)等待客戶端訪問
    for {
        conn, err := l.Accept()
        if err != nil {
            fmt.Println("accept error", err)
        }
        fmt.Printf("訪問客戶端信息:con = %v 客戶端ip=%v\n", conn, conn.RemoteAddr())
        go process(conn)
    }
}
func main() {
    Server()
}

客戶端功能

  • 編寫一個客戶端程序,能鏈接到服務端的8888窗口
  • 客戶端可以發(fā)送單行數(shù)據(jù),然后就退出
  • 能通過終端輸入數(shù)據(jù)( 輸入一行發(fā)送一行),并發(fā)送給服務器端
  • 在終端輸入exit,表示退出程序
import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
)
func main() {
    con, err := net.Dial("tcp", "0.0.0.0:8888")
    if err != nil {
        fmt.Println("connect err", err)
        return
    }
    fmt.Println("con 成功=", con)

    for {
        //客戶端可以發(fā)送單行數(shù)據(jù),然后就退出
        reader := bufio.NewReader(os.Stdin) //os.Stdin代表標準輸入[終端]

        //從終端讀取一行用戶輸入,并準備發(fā)送給服務端
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("readstring err = ", err)
        }
        line = strings.Trim(line, " \r\n")
        if line == "exit" {
            break
        }
        //再將line發(fā)送給服務器
        n, err := con.Write([]byte(line))
        if err != nil {
            fmt.Println("con.write err = ", err)
        }
        fmt.Printf("發(fā)送了%d字節(jié)到服務器\n", n)
    }
    fmt.Println("程序退出")
}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容