go实现一个简单的游戏服务器框架(lotou)网络通信

代码仓库
网络通信相关代码请查下以下链接(https://github.com/sydnash/lotou/tree/master/network/tcp)

目前网络通信只实现了基于go的tcp的通信。

go的tcp相关的主要接口

  • net.JoinHostPort 将一个host和port组成一个合法的网络地址(host:port)
  • net.ResolveTCPAddr 讲一个string类型的网络地址转换成一个TCPAddr 可以是tcp4 tcp6 tcp类型的地址
  • TCPListener TCP的监听器,负责接收请求并创建一个新的tcp连接
    • net.ListenTCP 在一个指定的端口和地址上监听tcp连接,如果端口是0,则内部随机选取一个可以用的端口。
    • (*TCPListener) AcceptTCP 阻塞调用goroutinue,直到有一个新的连接到来或者错误产生的时候,如果没有错误,则返回一个新的tcp连接。
  • TCPConn 表示一个tcp连接,通过它可以和远端进行数据的收发
    • func DialTCP(net string, laddr, raddr *TCPAddr) (*TCPConn, error) 请一个远程连接,laddr通常都是传入nil。
    • func (*TCPConn) Close 关闭一个tcp连接,关闭之后再进行读取将会返回error
    • func (*TCPConn) SetReadDeadline 设置读取数据的超时时间
    • func (*TCPConn) SetWriteDeadline 设置写数据的超时时间
    • func (*TCPConn) Write 发送数据
    • func (*TCPConn) Read 接收数据,会阻塞当前goroutinue知道有数据可读,如果设置了超时时间,则如果超时也会返回。
    • func (*TCPConn) SetKeepAlive 启动keepAlive之后,将会是操作系统层也会发送keepalive message,类似于应用层的心跳包的功能
    • func (*TCPConn) SetNoDelay 设置系统是否延迟发送小包数据,默认是true,表示数据在Write后立即发送。如果只关注每秒传输的量而不是打个packet延迟,可以考虑设置为false,这样可以减少系统调用,但是小包可能被延迟到某个时刻才发送。

lotou网络部分基本结构

在network/tcp目录下一个一共有三个文件

  • server 负责创建一个监听socket,当了连接请求的时候接受连接并创建一个agent
    • tcp.New 创建一个新的tcp server,并设置消息接收者
  • agent 负责每个连接的消息发送和接收
    每一个agent就相当于一个服务,一个agent开始运行之后,会启动一个定时器,如果这个TCPCon在一定时间内没有收到数据包,将会自行关闭。
    当有数据到来或者网络错误的时候,会将消息转发给关联的服务进行进一步处理。

  • client 负责请求远程连接以及socket上消息发送接收
    client接收连接、发送数据的命令
    client不需要显示的连接命令,当有数据需要发送的时候,会自动去请求连接

其他服务通过服务间的通信机制向agent和client发送消息,client、agent根据消息类型进行不同的操作。

client和agent内部都有两个goroutinue
- 一个用于处理其他服务发送过来的消息
- 一个用于从网络中接收数据并分包,一个合法的数据包有一个2字节的包长度开始。
该模块出了分包,不负责数据的编解码。

在该模块下有一个简单的测试用例,包含了基本用法。

你可能感兴趣的:(go,服务器,框架,游戏,tcp,go)