go语言实现简单的tcp通信

golang tcp

简介

回到家里太冷了,北方的暖气真好,最近正好学完了golang的基础部分的东西,用net包实现以下tcp通信,正好也算是加深一下对计网的记忆

环境

pc,wsl,vscode,golang

思路以及代码

tcp是面向连接的协议嘛,所以肯定要有连接,因此我就写一个server端和一个client端进行通信

server端先确定要做哪些事情

  1. 监听端口
  2. 等待连接
  3. 接收和发送信息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    package main

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

    func process(conn net.Conn) {
    defer conn.Close()
    for {
    reader := bufio.NewReader(conn) //读取conn中的对象
    var buf = [512]byte{}
    n, err := reader.Read(buf[:]) //使用reader中read方法读取数据
    if err != nil {
    fmt.Printf("read from conn failed,err:%v\n", err)
    break
    }
    rec := string(buf[:n])
    fmt.Printf("%v", rec)
    input := bufio.NewReader(os.Stdin)
    s, _ := input.ReadString('\n')
    conn.Write([]byte(s))
    }
    }

    func main() {
    //监听端口
    listen, err := net.Listen("tcp", "127.0.0.1:4444")
    if err != nil {
    fmt.Printf("listen failed ,err::%v\n", err)
    }
    //等待连接
    for {
    conn, err := listen.Accept() //没有收到连接请求就一直堵塞
    if err != nil {
    fmt.Printf("connect failed ,err:%v\n", err)
    continue
    }
    //接收数据返回接受无误
    //用一个gorutine去处理连接
    go process(conn)
    }
    }
    clint端负责请求连接和发送数据,输入Q的时候退出连接
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    package main

    import (
    "bufio"
    "fmt"
    "net"
    "os"
    "strings"
    )

    //请求连接
    //发送数据

    func main() {
    //请求连接
    conn, err := net.Dial("tcp", "127.0.0.1:4444")
    if err != nil {
    fmt.Println("dial failed,err:", err)
    return
    }
    defer conn.Close()
    //发送数据
    for {
    input := bufio.NewReader(os.Stdin) //从终端读入数据
    s, _ := input.ReadString('\n')
    if strings.ToUpper(s) == "Q" {
    return
    }
    //开始发送
    _, err = conn.Write([]byte(s))
    if err != nil {
    fmt.Println("write failed,err:", err)
    }
    //接收server端返回的信息
    buf := [512]byte{}
    n, err := conn.Read(buf[:])
    if err != nil {
    fmt.Println("read failed,err:", err)
    return
    }
    fmt.Println(string(buf[:n]))
    }
    }

    通信截图

    使用nc和server进行通信
    nc-serv1
    nc-serv2
    使用nc和client进行通信
    nc-cli1
    nc-cli2
    使用server和client进行通信
    serv-cli1
文章目录
  1. 1. golang tcp
    1. 1.0.1. 简介
    2. 1.0.2. 环境
    3. 1.0.3. 思路以及代码
  2. 1.1. tcp是面向连接的协议嘛,所以肯定要有连接,因此我就写一个server端和一个client端进行通信
    1. 1.1.1. 通信截图
,