go 实现简单版并发服务器

service_tcp.go :

package main

import (
    "net"
    "fmt"
    "strings"
)

func main()  {
    //监听
    listener ,err := net.Listen("tcp","127.0.0.1:8000")
    if err !=nil{
        fmt.Println("net.Listen err = ",err)
        return
    }

    defer listener.Close()

    //接受多个用户
    for{
        conn,err := listener.Accept()
        if err !=nil{
            fmt.Println("listener.Accept err=",err)
            return
        }

        //处理多个请求,新建一个一个协程
        go HandleConn(conn)
    }
}

//处理用户请求
func HandleConn(conn net.Conn) {
    //函数调用完毕,自动关闭 conn
    defer conn.Close()

    //获取客户端的网络地址信息
    addr := conn.RemoteAddr().String()
    fmt.Println(addr, "conncet successful")

    buf := make([]byte, 2048)

    for {
        //读取用户数据
        n, err := conn.Read(buf)

        if err != nil {
            fmt.Println("err = ", err)
            return
        }

        fmt.Printf("[%s]: %s\n", addr, string(buf[:n]))

        if "exit" == string(buf[:n-1]){
            fmt.Println(addr, " exit")
            return
        }

        conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }
}

client_tcp.go:

package main

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

func main() {
    //主动连接服务器
    conn, err := net.Dial("tcp", "127.0.0.1:8000")
    if err != nil {
        fmt.Println("net.Dial err = ", err)
        return
    }

    //main 调用完毕,关闭连接
    defer conn.Close()

    go func() {
        buf := make([]byte, 2048)
        for {
            n, err := conn.Read(buf)
            if err != nil {
                fmt.Println("conn.Read err = ", err)
                return
            }
            addr := conn.RemoteAddr().String()
            fmt.Printf("from %s: 服务器应答消息内容: %s", addr, string(buf[:n])) //打印接收到的内容, 转换为字符串再打印
        }
    }()

    //获取键盘输入的内容
    str := make([]byte, 2048)
    for {
        n, err := os.Stdin.Read(str) //从键盘读取内容, 放在str
        if err != nil {
            fmt.Println("os.Stdin. err = ", err)
            return
        }

        if "exit" == string(str[:n-1]){
            return
        }

        //把输入的内容给服务器发送
        conn.Write(str[:n])
    }
}

效果:

服务端:

file

客户端:

file

交互效果

file

最后附上 github 地址: link

本文章首发在 GolangCaff

每天都坚持学习. 日积月累收获就会很多, 欢迎大家跟我一起学习,我的博客