GoLang實現TCP協議客戶端和服務端

aside section._1OhGeD · · 274 次點擊 · · 開始瀏覽    

TCP客戶端:

// TCP Client端設計
// 使用命令行啟動  *.exe 127.0.0.1:5000
package main

import (
    "fmt"
    "net"
    "os"
    "time"
)

func main() {
    var buf [512]byte
    if len(os.Args) != 2 {
        fmt.Fprintf(os.Stderr, "Usage: %s host:port", os.Args[0])
    }
    service := os.Args[1]
    // 綁定
    tcpAddr, err := net.ResolveTCPAddr("tcp", service)
    checkError(err)
    // 連接
    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    checkError(err)
    rAddr := conn.RemoteAddr()
    //for {
    // 發送
    n, err := conn.Write([]byte("Hello server"))
    checkError(err)
    // 接收
    n, err = conn.Read(buf[0:])
    checkError(err)
    fmt.Println("Reply form server", rAddr.String(), string(buf[0:n]))
    time.Sleep(time.Second * 2)
    //}

    conn.Close()
    os.Exit(0)
}
func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error: %s", err.Error())
        os.Exit(1)
    }
}

TCP服務器

// TCP Server 端設計
// 使用命令行啟動  *.exe
package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    // 服務端端口
    service := ":5000"
    // 綁定
    tcpAddr, err := net.ResolveTCPAddr("tcp", service)
    checkError(err)
    // 監聽
    listener, err := net.ListenTCP("tcp", tcpAddr)
    checkError(err)
    for {
        // 接受
        conn, err := listener.Accept()
        if err != nil {
            continue
        }
        // 創建 Goroutine
        go handleClient(conn)
    }
}
func handleClient(conn net.Conn) {
    // 逆序調用 Close() 保證連接能正常關閉
    defer conn.Close()
    var buf [512]byte
    for {
        // 接收數據
        n, err := conn.Read(buf[0:])
        if err != nil {
            return
        }
        rAddr := conn.RemoteAddr()
        fmt.Println("Receive from client", rAddr.String(), string(buf[0:n]))
        _, err2 := conn.Write([]byte("Welcome client"))
        if err2 != nil {
            return
        }
    }
}
func checkError(err error) {
    if err != nil {
        fmt.Fprintf(os.Stderr, "Fatal error %s", err.Error())
        os.Exit(1)
    }
}

本文來自:簡書

感謝作者:aside section._1OhGeD

查看原文:GoLang實現TCP協議客戶端和服務端

入群交流(和以上內容無關):Go中文網 QQ 交流群:729884609 或加微信入微信群:274768166 備注:入群;關注公眾號:Go語言中文網

274 次點擊  
加入收藏 微博
添加一條新回復 (您需要 登錄 后才能回復 沒有賬號 ?)
  • 請盡量讓自己的回復能夠對別人有幫助
  • 支持 Markdown 格式, **粗體**、~~刪除線~~、`單行代碼`
  • 支持 @ 本站用戶;支持表情(輸入 : 提示),見 Emoji cheat sheet
  • 圖片支持拖拽、截圖粘貼等方式上傳