GoLang实现TCP协议客户端和服务端

作者: 陌若尘_c167 | 来源:发表于2019-11-04 16:41 被阅读0次

    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)
        }
    }
    

    欢迎关注【技术型项目经理】公众号。可获取软件行业动态、技术积累和项目管理理念文章分享。选择「考试经验」菜单「PMP」、「高项」(信息系统项目管理师)、「CISSP」、「GoLang」可获取学习资料。

    相关文章

      网友评论

        本文标题:GoLang实现TCP协议客户端和服务端

        本文链接:https://www.haomeiwen.com/subject/snpdbctx.html