[GO]简单的并发服务器

Posted 蟒城贝勒爷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[GO]简单的并发服务器相关的知识,希望对你有一定的参考价值。

package main

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

func HandleConn(conn net.Conn)  {
    //调用完毕
    defer conn.Close()
    //获取客户端的网络地址信息
    addr := conn.RemoteAddr().String()
    fmt.Printf("[%s] connect success", addr)

    buf := make([]byte, 2048)

    for true {
        //读取用户的数据
        n, err := conn.Read(buf)
        if err != nil {
            fmt.Println("Read data err = ", err)
        }
        fmt.Printf("[%s]: %s\\n", addr, string(buf[:n]))
        //把数字转换成大写再给用户

        if "exit" == string(buf[:n-1]) { //为什么这里要-1,因为在用户输入完以后是以回车确认的,比如用户输入\'a\',那么对于程序来说实际是输入了\'a\\n’,那这里必须把用户输入的后缀去了,比对才会成功
            fmt.Println(addr, "exit")
            return
        }
        //把数据替换为大写,再向用户发送
        conn.Write([]byte(strings.ToUpper(string(buf[:n]))))
    }

}

func main() {
    //监听
    listener, err := net.Listen("tcp", ":8000") //不写IP地址代表监听的是本机
    if err != nil {
        fmt.Println("listener errinfo = ", err)
        return
    }
    defer listener.Close()

    for true {
        //接收用户的请求
        conn,err := listener.Accept()//阻塞,等待用户连接
        if err != nil {
            fmt.Println("accept err = ", err)
            return
        }
        //新建一个协程
        go HandleConn(conn)
    }
}

那么使用netcat进行测试后就会有这样的结果

以上是关于[GO]简单的并发服务器的主要内容,如果未能解决你的问题,请参考以下文章

[Go] 并发和并行的区别

[GO]简单的并发服务器

Go语言2

Go语言开发教程

用go写爬虫服务并发请求,限制并发数

Go 语言入门并发