美文网首页go
开发go并发服务器和请求客户端

开发go并发服务器和请求客户端

作者: 女神经柒月 | 来源:发表于2018-10-31 13:50 被阅读8次

    服务端

    package main
    
    import (
        "strings"
        "fmt"
        "net"
    )
    
    // 这是服务端接受参数,同时把参数返回回去,如果遇到参数为exit,那么断开连接
    func handleConn (conn net.Conn){
        // 获取连接着的ip
        addrIP  := conn.RemoteAddr().String()
        fmt.Printf("%s 已连接", addrIP)
        buf := make ([]byte, 1024*2)
         // 这里要放到最前面,因为只有放到最前面才能被执行,否则的话, 
         // 下面退出了,结果这里还没有关闭,容易造成客户端长时间等待响应
        defer conn.Close()
    
        for {
                n, err:= conn.Read(buf)
                if err != nil {
                fmt.Println("conn.Read err = ",err)
                return
            }
            result := strings.ToUpper(  string( buf[:n] ) )
            fmt.Println(  result )
            // 检查是否是退出行为,也就是是否检测到了exit
            //其实这里多了一个字符,那么需要把最后的\n去掉,然后再比较
            if  string( buf[:n - 2] ) == "exit" {
                fmt.Printf("%s 已退出", addrIP) 
                return
            }
            // 把数据返回回去
            conn.Write( []byte (result))
        }
    }
    func main () {
        // 创建一个服务
        Server,err := net.Listen("tcp", "127.0.0.1:8000")
        if err != nil {
            fmt.Println("listen err = ",err)
            return
        }
    
        defer Server.Close()
        // for循环代表时刻保持连接
        for {
    
            conn, err:= Server.Accept()
            if err != nil {
                fmt.Println("conn err = ",err)
                return
            }
            defer conn.Close()
            go handleConn(conn)
        }   
    }
    
    
    

    客户端

    package main
    
    import (
        "os"
        "net"
        "fmt"
    )
    
    func main ( ) {
         conn,err := net.Dial("tcp", "127.0.0.1:8000");
            if err != nil {
            fmt.Println("conn err = ", err)
                // 终止主协程
                return
            }
            // defer conn.Close()
            // 输入
            str := make([]byte, 1024 * 2)
        go func ( ) {
    
            for {
                n,err := os.Stdin.Read(str)
                if err != nil {
                   fmt.Println("err = ", err)
               }
                // 拿到数据
               // 去发送
               // 发送之前判断,最好不要这样
               // if  string( str[:n-2]  ) == "exit" {
               //   return
               // }
               conn.Write(str[:n]);
               }
            } ()
         
                // 创建一个协程,,用来输入
                for { 
                    buf := make ( [] byte, 1024 * 2);
                    defer conn.Close()
                    n,err:=conn.Read(buf)
                    if err != nil {
                        return
                    }
                    result  := string(buf[:n]);
                    fmt.Println("result = ",result)
                }
         
                
        }
    

    相关文章

      网友评论

        本文标题:开发go并发服务器和请求客户端

        本文链接:https://www.haomeiwen.com/subject/hvhatqtx.html