码迷,mamicode.com
首页 > 其他好文 > 详细

[GO]简单的并发服务器

时间:2018-09-20 17:27:23      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:ima   读取   netca   输入   str   程序   信息   并发   func   

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]简单的并发服务器

标签:ima   读取   netca   输入   str   程序   信息   并发   func   

原文地址:https://www.cnblogs.com/baylorqu/p/9681593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!