热爱互联网

Golang TCP Server

这两天利用空闲时间用Golang写了个简单的TCP Server.
其实用Golang写TCP Server非常简洁,每来一个连接就分配一个goroutine去处理,对于每个处理Conn的goroutine只负责接收数据,再将分好的数据包丢到缓冲区中交给另外创建的一个goroutine处理,高并发就是这么来的。

每个数据包的组成: 包长 + 类型 + 数据
–> 4字节 + 2字节 + 数据
–> uint32 + uint16 + []byte
数据部分用protobuf封装,protobuf简直太赞了.

心跳机制其实只需要服务器设置读超时,客户端发的任何一个包都可以看做是心跳包,当然为了保证可靠性,客户端还是需要每隔一段时间发送一个PING包的。

测试:
服务器接受了5000个TCP长连接,对于每个连接分别由goroutine处理,每个连接分配1K缓冲区接收数据,当数据大于1K时缓冲区会自动扩容。平均每个连接耗费大概20K内存,总共100M多一点。
一般认为系统底层默认的socket读写缓冲区各8K,当然每个系统的设置不一样,也可以手动更改这个缓冲区大小。
另外golang现在的GC很慢,非常慢,客户端断开连接后,服务器需要等很久才释放socket占用的内存,据说go1.3的GC会大大改进,期待ing。

/************************************************/
经常逛github,但这是第一次上传代码,搜噶,发现世界如此美妙。。。
https://github.com/gansidui/gotcp

Post a Comment

Your email is kept private. Required fields are marked *