zoukankan      html  css  js  c++  java
  • [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进行测试后就会有这样的结果

  • 相关阅读:
    mysql 常用方法
    jquery input click取消默认事件
    Sprint Boot 集成mongodb
    MSSQL复习笔记
    H5(3)基础知识点补充
    H5(2) 前端基础知识点补充
    H5(1) h5的新特性
    用队列的方式实现日志
    Spring.Net的快速应用
    总结2016/展望2017
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9681593.html
Copyright © 2011-2022 走看看