socket通信问题解决

该方法会阻塞直到有输入数据可用、到达文件末尾或出现异常。如果len为0,则不读取任何字节并返回0。如果因为流到达文件末尾而无法读取任何字节,则返回-1。read方法将尝试读取至少一个字节,并将其存储到b数组中。参数包括目标缓冲区b、起始偏移量off和最大读取字节数len。如果在读取过程中遇到IOException,异常会被捕获并视为文件结束,已读取的字节存储到b中并返回读取的字节数。
摘要由CSDN通过智能技术生成
   威海的项目 负责socket通信的服务器端代码,与pb的客户端通信。服务器端对每个客户端开一个接收消息的线程,一个发送消息的线程,实时监测数据库中的某个列,查看是否有消息需要发送,服务器端需要实时获得客户端的状态,查看与客户端之间的网络连接状况。
 问题1: 当服务器网络异常(比如说网线一旦被拔出了),socket会抛出异常,可以实时监测到网络状况。客户端网线拔出也能实时监测到,但是客户端网线拔了,服务器端      不能监测到当前网络状态。
               解决方案 :心跳机制 这个需要自己进一步去了解
                目前我自己写得方案是,每隔30秒服务器向每个客户端发出一条消息,这样大概1分钟后对应的接收消息的线程会报异常,捕获这个异常,置指定客户端无效
 问题2: 测试阶段发现cpu一直保持在100%,排除出两个地方
               1.发送消息的进程,无限循环,查询数据库,系统压力过大。
               2.接收消息线程,在读输入流的时候读出-1后继续读,导致无限循环,系统压力过大。
           解决方案:1.干掉发送消息的线程,在内存中开一块区域存储指定客户端及其对应的socket(HashMap),在有消息发送的时候再获取socket发送消息
                           2.读出-1的时候跳出循环,置该客户端异常。
 
 附:InputStream 的输入流read方法解释
    int java.io.InputStream
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值