[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进行测试后就会有这样的结果

posted @ 2018-09-20 16:22  蟒城贝勒爷  阅读(133)  评论(0编辑  收藏  举报