Golang中client-server模型

技术文档网 2021-06-01

简易的client-server模型

客户端和服务端的交互过程

服务端

(1)监听端口返回listen: net.Listen()

(2)同意连接,得到conn: listen.Accept()

(3)处理连接: handleConn(conn)

客户端:

(1)发送建立连接请求:conn, err := net.Dial()

(2)处理连接,如往连接中写入数据

首先来开下服务端的程序

package main

import (
    "bufio"
    "fmt"
    "log"
    "net"
    "strings"
    "time"
)

func main() {
    listener, err := net.Listen("tcp", "localhost:8000")

    if err != nil {
        log.Fatal(err)
    }

    for {
        conn, err := listener.Accept()
        if err != nil {
            log.Print(err)
            continue
        }
        // concurrence deal request, not parallel
        go handleConn(conn)
    }
}

func handleConn(c net.Conn) {

    input := bufio.NewScanner(c)
        // 等待客户端的输入,阻塞在此处,scan会按行读取
    for input.Scan() {
        //相比较netcat1,这里是并发打印的,打印先后顺序无法确定,goroutine还可以go
        go echo(c, input.Text(), 1*time.Second) //在处理单个请求的实收也可以用并发
    }
    c.Close()
}

func echo(c net.Conn, shout string, delay time.Duration) {
    fmt.Fprintln(c, "\t", strings.ToUpper(shout))
    time.Sleep(delay)
    fmt.Fprintln(c, "\t", shout)
    time.Sleep(delay)
    fmt.Fprintln(c, "\t", strings.ToLower(shout))

}

客户端的程序:

package main

import (
    "io"
    "log"
    "net"
    "os"
)

func main() {
    conn, err := net.Dial("tcp", "localhost:8000")
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()
    go mustCopy(os.Stdout, conn) // 输出服务端返回的conn
    mustCopy(conn, os.Stdin)     //客户端写入conn
}

func mustCopy(dst io.Writer, src io.Reader) {
    //io.Copy其实就是将src中的内容写入dst
    if _, err := io.Copy(dst, src); err != nil {
        log.Fatal(err)
    }
}

相关文章

  1. Golang中匿名函数的使用

    匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于

  2. Golang中client-server模型

    简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (

  3. 在Leaf中使用Protobuf

    本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务

随机推荐

  1. Golang中匿名函数的使用

    匿名函数在函数中抽象出来 对于一个项目,为了抽象,可以将一些功能相同的操作写成匿名,下面就是展示如何使用匿名函数: 匿名函数的价值: 在函数内部的匿名函数,共享函数的局部变量,其实这就是封装,类似于

  2. Golang中client-server模型

    简易的client-server模型 客户端和服务端的交互过程 服务端 (1)监听端口返回listen: net.Listen() (2)同意连接,得到conn: listen.Accept() (

  3. 在Leaf中使用Protobuf

    本文假定你已经仔细阅读过 TUTORIAL 一个简单的上手 在开始本范例之前,请确保已经获取了 Leaf 和 Leafserver 并且正确配置(否则请阅读 TUTORIAL 中相关内容)。 编写服务