Golang编写多任务Echo服务器

创作人 Leo


编辑时间 Wed Jan 1,2020 at 09:28


Golang编写多任务Echo服务器

简介

与网络相关的类型在 net 包中

读取网络数据需要用到 io 、bufio 包

建立TCP服务器

func (socket *Socket) connect() {
    // 创建一个TCP地址
    tcpAddr := &net.TCPAddr{IP:net.ParseIP(socket.host), Port:socket.port, Zone:"IPv4"}
    // 监听TCP
    server,err := net.ListenTCP("tcp", tcpAddr)
    // 设置最终必须关闭Server地址监听
    defer server.Close()
    utils.CheckErr(err)
    // 循环接收客户端连接
    for ; ;  {
        tcpConn,err := server.AcceptTCP()
        utils.CheckErr(err)
        // 当有客户端连接,启动一个协程进行通信
        go socket.clientHandle(tcpConn) 
    }
}

服务器的建立过程与其他语言(java、c)类似,但是过程更简单了

  1. 申请socket描述符

  2. 监听ip和端口

  3. 接收客户端连接

使用协程可以很方便的进行多客户端通信任务,如果需要与主进程同步数据,可以使用 channel 处理

TCP客户端连接

func (client *Client) connect() {
    // Dial函数可以方便的连接到一个服务器
    conn,err := net.Dial("tcp", fmt.Sprintf("%s:%d", (*client).host, (*client).port))
    defer client.close(conn)
    ...
}

客户端相对简单,net.Dial 封装了多个网络请求的详细操作,包括 tcp、udp、icmp、http 等

数据读取

func (socket *Socket) readFully(conn net.Conn) ([]byte, error) {
    //ReadString 读取数据,直到遇到第一个 delim 字符为止
    data,err := bufio.NewReader(conn).ReadString('\n') 
    utils.CheckErr(err)
    return bytes.NewBufferString(data).Bytes(),nil
}

这里以一个Echo服务器为例,以 \n 为分隔符

ReadString 函数会在读取到的第一个 处将数据返回,返回的是带有 \n 的字符串类型

可以使用 Strings.TrimSpace 函数去除

完整代码:https://github.com/phpxin/godemos 中socket包


阅读:1329
搜索
  • Linux 高性能网络编程库 Libevent 简介和示例 2678
  • web rtc 学习笔记(一) 2591
  • react 学习笔记(一) 2490
  • Mac系统编译PHP7【20190929更新】 2388
  • zksync 和 layer2 2369
  • Hadoop Map Reduce 案例:好友推荐 2287
  • Hadoop 高可用集群搭建 (Hadoop HA) 2275
  • 小白鼠问题 2212
  • Linux 常用命令 2176
  • 安徽黄山游 2152
简介
不定期分享软件开发经验,生活经验