Go语言 之Socket并发的C/S模型通信

服务端:

package main

import (
    "fmt"
    "net"
)

func DoHandler(conn net.Conn) {
    defer conn.Close()
    //读取数据
    fmt.Println("开始读取数据")
    b := make([]byte, 1024)
    for {
        n, err := conn.Read(b)
        if err != nil {
            fmt.Println(err.Error())
            return
        }
        fmt.Println(conn.RemoteAddr().String() + ": 读到的数据为" + string(b[:n]))
    }

}

func main() {
    listen, err := net.Listen("tcp", ":8000")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer listen.Close()
    //循环
    for {
        //阻塞等待客户端连接
        conn, err := listen.Accept()
        if err != nil {
            fmt.Println(err.Error())
            return
        }
        //创建协程处理逻辑
        go DoHandler(conn)
    }
}

客户端:

package main

import (
    "fmt"
    "net"
    "os"
)

func main() {
    //创建客户端
    listen, err := net.Dial("tcp", ":8000")
    if err != nil {
        fmt.Println(err.Error())
        return
    }
    defer listen.Close()

    go func() {
        //获取重建盘输入的数据
        str := make([]byte, 2048)
        for {
            n, err := os.Stdin.Read(str)
            if err != nil {
                fmt.Println(err.Error())
            }
            //发送到服务端
            _, err1 := listen.Write(str[:n])
            if err1 != nil {
                fmt.Println(err.Error())
            }
        }
    }()

    buf := make([]byte, 2048)
    for {
        //读取数据
        n, err := listen.Read(buf)
        if err != nil {
            fmt.Println(err.Error())
        }
        fmt.Println("读到的数据:" + string(buf[:n]))
    }

}

 

posted @ 2019-07-06 15:52  样子2018  阅读(750)  评论(0编辑  收藏  举报