go

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

2018-10-31  本文已影响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)
            }
     
            
    }
上一篇 下一篇

猜你喜欢

热点阅读