Fork me on GitHub

Go语言之网络编程

一、网络编程基础

二、TCP Socket编程

(一)流程

首先应该了解服务端和客户端的处理流程:

1、服务端处理流程

  • 监听端口
  • 接收客户端tcp链接,建立双方的链接
  • 创建goroutine,处理该链接的请求

2、客户端处理流程

  • 建立与服务端的链接
  • 与服务端进行通信
  • 关闭链接

(二)代码实现

1、服务端(server.go)

package main

import (
    "fmt"
    "net"
)

func processReq(conn net.Conn) {
    // 延时关闭conn
    defer conn.Close()
    // 与服务端进行通讯
    for {
        // 创建一个切片,盛放消息
        buf := make([]byte, 1024)
        // 1、等待客户端通过conn发送消息
        // 2、如果没有消息,协程就阻塞在这里
        m, err := conn.Read(buf)
        if err != nil {
            fmt.Println("客户端退出")
            return
        }
        // 3、显示客户端发送的内容
        fmt.Print(string(buf[:m]))
    }
}

func main() {
    fmt.Println("服务器开始监听,等待客户端的连接:")
    ls, err := net.Listen("tcp", "0.0.0.0:9000")

    if err != nil {
        return
    }
    // 延时关闭listen
    defer ls.Close()

    // 等待客户端连接
    for {
        fmt.Println("等待客户端来连接:")
        conn, err := ls.Accept()
        if err != nil {
            return
        } else {
            fmt.Printf("con=%v, 客户端ip=%v\n", conn, conn.RemoteAddr().String())
        }

        // 每一个客户端启动一个协程处理,防止过长时间相应
        go processReq(conn) //conn接口类型,是引用

    }
}

2、客户端(client.go)

package main

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

func main() {
    conn, err := net.Dial("tcp", "127.0.0.1:9000")
    if err != nil {
        return
    }

    reader := bufio.NewReader(os.Stdin)

    // 进行通讯
    for {
        line, err := reader.ReadString('\n')
        if err != nil {
            fmt.Println("客户端读取终端输入出错了...")
        }
        // 将line数据发送到服务器
        _, err = conn.Write([]byte(line))
        if err != nil {
            fmt.Println("客户端发送数据出错了...")
        }

    }

}

 

posted @ 2022-02-26 07:08  iveBoy  阅读(131)  评论(0编辑  收藏  举报
TOP