Java中TCP通信

标签: 无 分类: 未分类 创建时间:2020-06-11 01:37:28 更新时间:2024-12-03 13:01:37

前言

需求,通过网络,控制硬件的开关。典型的应用场景,就是使用手机,远程发送指令到摄像头上,然后控制摄像头的关闭。这里用到了TCP通讯。

高性能解决方案

对于TCP和Http连接的不同,我觉得还应该有专门的文章去解释。我这里说到的高性能或者是高并发,是针对TCP连接而言的,即:我如何同时支持数千条,上万条TCP连接,而不中断。我觉得,这和http请求的高并发量还是有些区别的吧。

经过实习生的探索,他告诉我,高并发的TCP连接,只能是通过nginx进行集群的搭建,配合Redis缓存以及RQ消息队列等技术。其实我是持怀疑态度的。如果所有的并发都要通过增加机器的数量来解决,那成本将变得无比的巨大,比如经过他的JMeter测试,以他现有的电脑性能,I3-7770和8G内存,win10 64为系统,平均的连接数,最多为300-400之间,也就是只能支持同时连接300个TCP连接,也就是只能支持开300个线程。这个我觉得虽然最快和最简单的方法就是通过Nginx的Stream模块进行TCP的集群搭建,但是在单机的瓶颈中,还是有可以突破的地方。

随着不断的偶尔进行查询,我发现了在并发领域有很多的专业术语,比如IO多路复用,协程等名词和技术,我觉得每一个都值得细细的品味。

文章七中对单台服务器最大并发TCP连接数限制分为了以下几类:

  • 文件句柄限制
  • 进程限制
  • 全局限制

同时还提到了内存限制、和带宽限制,所以我们在解决高并发的问题的时候,就应该这些方面进行考虑。

参考文章:
1.Java异步NIO框架Netty实现高性能高并发
2.高并发的socket的高性能设计
3.深入了解 Java-Netty高性能高并发理解 (对Netty进行了讲解,以及提到了Netty高性能的原理,异步非阻塞通信(I/O多路复用)、零拷贝、内存池、高效的Reactor线程模型)
4.高并发架构的TCP知识介绍 (提高连接常用套路,这里除了讲了TCP三次握手和连接与监听的基本原理,还提到了比如说多进程、多线程、IO多路服用、协程等手段,还有理论的连接数等,我觉得这篇文章还是可以好好的咀嚼的,东西很多)
5.Netty框架实现tcp通信 (这篇文章具体讲解了,如何使用Netty框架实现TCP通信,有具体的源码)
6.Java高并发异步Socket编程 (这篇文章概念其实挺多的)
7.物联网高并发编程之单台服务器最大并发TCP连接数 (这篇提供了TCP连接限制的一些主要因素)

epoll的模型

C10K问题

文章一中提到了一个观点,就是:

在做技术规划和架构设计的时候,我常常告诫技术人员,不要做过度设计,如果咱们只有1万用户,先别去操百万用户在线的心。淘宝那么大,也是从 Apache、PHP、MySql 发展起来的,没人能预见到淘宝会发展到这样一个规模,一旦发展起来,业务的爆发性增长会驱动技术的迅速发展,在业务规模还不及格的时候,不用为技术的未来担心。

这一点我倒是非常的赞同的,所以我常常被实习生问的哑口无言,他问我,这个系统要不要使用分库分表和高并发?一个只有几十个管理员可以访问的小程序,你让我去做分库分表和集群,我只是一个菜鸟,很难回答你这个问题啊。但是话又说回来了,考虑到系统的可扩展性,万一哪天,公司突然上市了,突然成了阿里巴巴,那你的应用程序不得重新开发吗?在考虑到经济成本和人员的素质问题上,其实这也是一个见仁见智的问题了。

言归正传,C10K问题,即[在同时连接到服务器的客户端数量超过 10000 个的环境中,即便硬件性能足够, 依然无法正常提供服务]的问题。

zero copy的upgrade

java中的TCP框架

参考文章:
1.netty搭建Tcp服务器实践
2.java socket框架_优秀的国产高性能TCP/UDP/HTTP开源网络通信框架——HP-Socket
3. ldcsaa /HP-Socket
4.高并发网络框架Netty 这里我觉得对于Netty的模型和原理的解释也还算是简单易懂了,没有具体的开发代码
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。