go 实现简单版并发服务器
2

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

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

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!