您的位置:首页 > 理论基础 > 计算机网络

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

2016-12-09 10:37 911 查看
代码仓库

网络通信相关代码请查下以下链接(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字节的包长度开始。

该模块出了分包,不负责数据的编解码。

在该模块下有一个简单的测试用例,包含了基本用法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  服务器 框架 游戏 tcp go