查看: 1142|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2022-9-16 05:52
  • 签到天数: 1368 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-9-30 11:25:03 | 显示全部楼层 |阅读模式
    分享到:
    既然打算使用Firefly Prime这块板子作为一个服务器,那么TCP是必不可少的,所以TCP Server将是一个重点。
        TCP Server我就不多说了,大家也应该都了解了,而且要实现一个TCP的Server也不是很难,就是通过调用那几个Socket API函数来实现。
        不过这里需要考虑一个问题:当同一时刻有大量的Client连接进来的时候,Server能否处理或稳定运行?
       
        通常最常用并且简单的方法是每接收到一个Client申请就为其创建一个线程,但是一般最多也就可以处理3000多个连接,其后再请求连接的Client将会发现连接被拒绝了。这是因为线程虽然能够并行运行,但是起占用的资源不少,线程开多了也是不能正常工作的。
        当然在Windows下可以用IOCP来实现、Linux下可以用EPoll来实现,但是其开发的工作量很大,需要考虑的很全面才能高效稳定运行,而且互相之间的移植很麻烦。
       
        现在golang一出,一切问题迎刃而解,因为golang有其特有的好东西--协程,比线程更少的占用资源,可以同时创建几十万个,而且代码写起来非常简单方便,最主要的是代码一分一毫不用修改,直接可以在不同平台上编译成本地原生代码来执行。
        GoFast库中的TCP Server,经过在Firefly Prime上的压力测试,设置Client每10秒发送100个字节的数据,Server将接收到的这100个字节再发回Client,可以稳定的同时处理15000个连接(最大16xxx个,为了稳定减少到15000个)。而此时CPU占用率在30%~40%,内存占用1xxM,这样的结果还算不错的。
       
        说了这么多,不如实际操作一下。还是来看看怎么使用吧。
        打开Test.go,找到这一块

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

       
        不用多解释了,一目了然。在进行压力测试时建议把fmt.Pringln都去掉,调试用的,增加资源占用。
        这样就完成了一个高性能的TCP Server,Client传过来的数据就是Data,怎样解析就按照自己的协议来定吧。
       
        下面附上部分TCP Server的实现代码,实际使用中不需要考虑,我也不再多说了,因为说起来就太长了,感兴趣可以自己看一看TCP.go文件,里面所有大写字母开头的函数都是可以调用的。

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

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 01:35 , Processed in 0.126012 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.