Java BIO / NIO 的 TCP / UDP 协议相关问题

韩曙亮
2023年度博客之星评选 TOP 1
博客专家认证
2020-06-01 10:48:23
最近写了个 客户端 服务器端 交互的程序

服务器端 : 局域网中的 电脑 , IntelliJ 环境运行的 Java 程序 TCP / UDP 接收并转发 客户端数据

手机端 : Android 手机运行的 TCP / UDP 客户端

测试延迟 : 手机本地上发到服务器 , 记录时间戳 , 服务器收到回送到手机本地 , 记录时间戳 , 计算这两个时间戳之间的差值作为延迟 ;

目前使用 BIO 模型 , 就是 ServerSocket 和 Socket , DatagramSocket 使用 TCP / UDP 协议 , 手机本地到服务器然后再下发 , 延迟95% 的情况都是 20 以内的毫秒数 , 但是偶尔会有几个 100 ms , 200ms , 300ms 的延迟 ;

延迟不稳定是如何造成的 , 如何进行优化 ?

有没有 Java 大佬帮忙想想解决思路
...全文
354 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianfang 2020-06-02
  • 打赏
  • 举报
回复
解释一下 记录服务器时间,是要发现延迟高的是出现在服务器的什么时间,然后和服务器分析对比。它们都使用服务器时间,不是为了服务器和客户端时间对比
qybao 2020-06-01
  • 打赏
  • 举报
回复
这个不好分析,还要结合监视某些数据才可以。 比如该时刻网速是否变慢(有大量上传下载影响带宽传送),监视网络流量 比如该时刻cpu是否处于峰值(被某程序)大量占用而来不及响应你的请求,监视cpu 等等 所以不能单纯地只从log时间来推断原因的
tianfang 2020-06-01
  • 打赏
  • 举报
回复
延迟首先是网络问题,手机只能使用wifi,如果wifi访问内,wifi用户过多或有计算机(也使用)传输大文件,就可能导致手机可用的网络带宽减少。这个可用控制wifi用户,特别是在别人下班的时候进行测试 bio收到请求后会生成处理进程对象实例,请求结束会销毁对象。这个产生会在jvm gc才真正释放 你可用在服务器的返回返回信息中,增加服务器时间,同时对服务器监控,我估计延时长的时候,正好是jvm gc时间。
韩曙亮 2020-06-01
  • 打赏
  • 举报
回复
给个解决思路 或者 研究方向即可
冰思雨 2020-06-01
  • 打赏
  • 举报
回复
修正一下, 1.上面回帖中的 中断 其实是 终端 这个词。 2.网络优化中, 选择信道的例子中,选择1信道和8信道都可以。如果楼主没有条件查看信道的占用情况,那么,可以逐个切换信道尝试一下,看看那个信道通信相对稳定一些,选择一个相对稳定的信道即可。
冰思雨 2020-06-01
  • 打赏
  • 举报
回复
有两点需要说明: 1. 时间戳不要客户端和服务端都取,两者的时间可能会不同步,从而产生误差。一般都是客户端生成时间戳,发送和接收的时候,记录两次,然后,计算时间差,从而得到网络传输数据的时长。 2. 如果不涉及服务端计算或者服务端IO等待(比如数据库操作,分布式缓存的操作等)之类的操作的话,服务端收到请求之后立即应答,那么,网络不稳定的情况,基本上和软件程序无关了。 综上所述,楼主现在遇到的网络不稳定的情况,绝大多数是由于硬件环境造成的。 首先,手机入网,一般采用的是无线网络,也就是通常所说的Wifi,无线网络在传输数据的时候,很容易受到干扰和信道占用等待的情况。 解释一下:一般情况下,WiFi网络会分13个左右的信道,每个信道之间会有重叠区域,也就是说,相邻的2~3个信道之间如果有数据传输,会造成干扰。同一个信道,同时只能完成一对点到点之间的通信,如果有多个中断使用同一个信道,那么,就要轮着来使用。所以,在这种场景下,无线终端(手机)在传输数据的时候,可能正巧碰到其他终端(手机,PAD等)正在通信,从而要等待他们传输完成,或者,由于他们占用相邻信道通信,产生干扰,将部分数据传错了,然后,重新传输,造成延迟。 其次,周围无线路由和AP节点,由于没有统筹安排,信道占用的情况会比较混乱,无线通信由于信道之间的干扰会造成通信效率的降低。 如何优化无线网络的环境? 一般情况下,wifi的覆盖范围是100M~300M, 首先,确保手机和无线路由的距离不要超过100M,距离越近,信号强度越高,抗干扰能力越强。 其次,有条件的话,查看一下周围其他无线路由所占用的信道情况,是自己的路由选择一个相对独立的信道。 比如,没有占用的信道是1,2,7,8,9这几个,那么,自己路由就选择8这个信道,和其他信道的重叠区域最小,尽可能避免干扰的情况。 第三,保证自己的无线路由下面,只连接你自己的一台手机。终端(手机或者PAD等)越多,通信效率越低,造成延迟的几率越大。 最后,说道硬件环境,除了无线路由之外,还要考虑无线路由与服务器之间的网络问题,如果是直连的局域网,那就没什么可以考虑的了,如果是公网,那环境就复杂多了。 另外,无线路由的收发能力和处理能力,有些时候也要考虑进去,极个别无线路由,抗干扰能力弱或者数据处理能力不稳定,也会造成延迟。
  • 打赏
  • 举报
回复
得看你的目的是什么,是测试网络还是测试服务端的处理能力。

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧