• [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
    ", addr, string(buf[:n]))
            //把数字转换成大写再给用户
    
            if "exit" == string(buf[:n-1]) { //为什么这里要-1,因为在用户输入完以后是以回车确认的,比如用户输入'a',那么对于程序来说实际是输入了'a
    ’,那这里必须把用户输入的后缀去了,比对才会成功
                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进行测试后就会有这样的结果

  • 相关阅读:
    *循环-04. 验证“哥德巴赫猜想”
    循环-03. 求符合给定条件的整数集
    *循环-01. 求整数段和【help】
    分支-15. 日K蜡烛图
    分支-14. 简单计算器
    *分支-13. 计算天数
    *分支-12. 计算火车运行时间
    自我介绍
    JAVA WEB第0课
    Forward团队-爬虫豆瓣top250项目-成员简介与分工
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9681593.html
Copyright © 2020-2023  润新知