天天看点

go 写 TCP 服务 基础 :goland 学习记录(1)

go 写 TCP 服务端/客户端 基础 :goland 学习记录(1)

  • ​​关于:go 语言 :Socket TCP​​
  • ​​服务端代码​​
  • ​​客户端代码​​
  • ​​效果​​
  • ​​源码​​

关于:go 语言 :Socket TCP

使用 go 语言写 TCP 服务端和客户端,最核心的就是 net 这个包。

我们使用这个包,就可以做 TCP 开发了

服务端代码

/*
* Copyright(C),2019-2020,
* Author:  dao
* Version: 1.0.0
* Date:    2021/6/11 16:35
* Description:
*
 */

package main

import (
    "fmt"
    "io"
    "log"
    "net"
    "time"
)

func main() {
    //使用协议是tcp,监听的地址是port
    listener, err := net.Listen("tcp", ":10001")
    if err != nil {
        fmt.Println("错误:"+"使用协议是tcp,监听 出错。", "server")
        log.Fatal(err)
    }
    //关闭监听的端口
    defer listener.Close()
    fmt.Println("准备开始侦听")
    for {
        //用conn接收链接
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("错误:"+"用conn接收链接 出错。", "server")
            log.Fatal(err)
        }
        //定义一个切片
        buf := make([]byte, 1024, 1024)
        //接收到的内容大小。
        n, err := conn.Read(buf)
        if err != nil && err != io.EOF {
            //对方断开连接。
            fmt.Println("错误:"+"对方断开连接。", "server")
            fmt.Println("错误:"+err.Error(), "server")
            log.Fatal(err)
        }
        data := string(buf[0:n])
        fmt.Println("收到:" + data)
        fmt.Println("(回包)服务端收到:" + data)
        conn.Write([]byte("(回包)服务端收到:" + data)) //通过conn的wirte方法将这些数据返回给客户端。

        //在结束这个链接之前需要睡 1 秒钟,再结束当前循环。
        time.Sleep(1 * 1e9)
        fmt.Println("准备与客户端断开连接:已休息:"+fmt.Sprintf("%d 秒", 1), "server")
        //准备与客户端断开连接。
        conn.Close()
    }
}      

客户端代码

/*
* Copyright(C),2019-2020,
* Author:  dao
* Version: 1.0.0
* Date:    2021/6/11 16:43
* Description:
*
 */

package main

import (
    "fmt"
    "io"
    "log"
    "net"
)

func main() {
    //使用协议是tcp,拨号。
    conn, err := net.Dial("tcp", ":10001")
    if err != nil {
        fmt.Println("错误:"+err.Error(), "server")
        log.Fatal(err)
        return
    }
    fmt.Println("访问IP地址是:", conn.RemoteAddr().String())
    fmt.Printf("客户端链接的地址及端口是:%v\n", conn.LocalAddr())
    //向服务端发送数据
    n, err := conn.Write([]byte("你好,我叫 daolizhe "))
    if err != nil {
        fmt.Println("错误:"+err.Error(), "server")
        log.Fatal(err)
        return
    }
    fmt.Println("向服务端发送的数据大小是:", n)
    //定义一个切片
    buf := make([]byte, 1024, 1024)
    //接收到的内容大小。
    n, err = conn.Read(buf)
    if err != nil && err != io.EOF {
        //对方断开连接
        fmt.Println("错误:"+err.Error(), "server")
        log.Fatal(err)
        return
    }
    //将回包的内容打印出来。
    fmt.Println(string(buf[:n]))
    //断开TCP链接。
    conn.Close()
}      

效果

服务端效果如下:

go 写 TCP 服务 基础 :goland 学习记录(1)