Firefly开源社区

【GoFast】5.物联网之基础 - TCP Server

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2015-8-11 22:46:31     
    既然打算使用Firefly RK3288这块板子作为一个服务器,那么TCP是必不可少的,所以TCP Server将是一个重点。
    TCP Server我就不多说了,大家也应该都了解了,而且要实现一个TCP的Server也不是很难,就是通过调用那几个Socket API函数来实现。

    不过这里需要考虑一个问题:当同一时刻有大量的Client连接进来的时候,Server能否处理或稳定运行?
    通常最常用并且简单的方法是每接收到一个Client申请就为其创建一个线程,但是一般最多也就可以处理3000多个连接,其后再请求连接的Client将会发现连接被拒绝了。这是因为线程虽然能够并行运行,但是起占用的资源不少,线程开多了也是不能正常工作的。
    当然在Windows下可以用IOCP来实现、Linux下可以用EPoll来实现,但是其开发的工作量很大,需要考虑的很全面才能高效稳定运行,而且互相之间的移植很麻烦。
    现在golang一出,一切问题迎刃而解,因为golang有其特有的好东西--协程,比线程更少的占用资源,可以同时创建几十万个,而且代码写起来非常简单方便,最主要的是代码一分一毫不用修改,直接可以在不同平台上编译成本地原生代码来执行。

    GoFast库中的TCP Server,经过在Firefly RK3288上的压力测试,设置Client每10秒发送100个字节的数据,Server将接收到的这100个字节再发回Client,可以稳定的同时处理15000个连接(最大16xxx个,为了稳定减少到15000个)。而此时CPU占用率在30%~40%,内存占用1xxM,这样的结果还算不错的。

    说了这么多,不如实际操作一下。还是来看看怎么使用吧。
    打开Test.go,找到这一块
1.png

    这里创建了一个TCP的Server,监听的端口是80,当然可以自己随意更改,大于0小于65536并且没被占用的端口都可以。
    其中有三个事件,分别是Client连接进来、接收到Client数据和Client断开事件。
    有了这三个事件就可以对每一个Client进行处理了,再来看看它们怎样使用
2.png

    不用多解释了,一目了然。在进行压力测试时建议把fmt.Pringln都去掉,调试用的,增加资源占用。
    这样就完成了一个高性能的TCP Server,Client传过来的数据就是Data,怎样解析就按照自己的协议来定吧。

    下面附上部分TCP Server的实现代码,实际使用中不需要考虑,我也不再多说了,因为说起来就太长了,感兴趣可以自己看一看TCP.go文件,里面所有大写字母开头的函数都是可以调用的。
3.png


    最后说明一点,虽然RK3288可以同时处理很多的Client,但是EMMC的速度相对较慢,不适合做大量的数据读写操作,所以在保存数据时要合理安排好程序,这才是考验编程功力的地方。不过话又说回来,这样一个小小的ARM能达到这样的性能,还能要求什么呢,在合适的地方物尽其用吧。

回复

使用道具 举报

发表于 2015-8-13 09:38:49     
支持原创!
暴走的创客!
回复

使用道具 举报

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2015-8-13 14:33:42     

感谢感谢:lol
回复

使用道具 举报

192

积分

0

威望

0

贡献

技术小白

积分
192
发表于 2016-3-14 16:43:29     
楼主是真心牛逼啊
回复

使用道具 举报

14

积分

0

威望

0

贡献

技术小白

积分
14
发表于 2016-8-6 10:07:17     
写的很好 ,请问代码可以下载 嘛
回复

使用道具 举报

230

积分

23

威望

20

贡献

技术达人

Rank: 2

积分
230

突出贡献

发表于 2016-8-6 17:58:03     
cwfwh 发表于 2016-8-6 10:07
写的很好 ,请问代码可以下载 嘛

https://github.com/tjCFeng
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

友情链接 : 爱板网 电子发烧友论坛 云汉电子社区 粤ICP备14022046号-2
快速回复 返回顶部 返回列表