威海的项目 负责socket通信的服务器端代码,与pb的客户端通信。服务器端对每个客户端开一个接收消息的线程,一个发送消息的线程,实时监测数据库中的某个列,查看是否有消息需要发送,服务器端需要实时获得客户端的状态,查看与客户端之间的网络连接状况。
问题1: 当服务器网络异常(比如说网线一旦被拔出了),socket会抛出异常,可以实时监测到网络状况。客户端网线拔出也能实时监测到,但是客户端网线拔了,服务器端 不能监测到当前网络状态。
解决方案 :心跳机制 这个需要自己进一步去了解
目前我自己写得方案是,每隔30秒服务器向每个客户端发出一条消息,这样大概1分钟后对应的接收消息的线程会报异常,捕获这个异常,置指定客户端无效
问题2: 测试阶段发现cpu一直保持在100%,排除出两个地方
1.发送消息的进程,无限循环,查询数据库,系统压力过大。
2.接收消息线程,在读输入流的时候读出-1后继续读,导致无限循环,系统压力过大。
解决方案:1.干掉发送消息的线程,在内存中开一块区域存储指定客户端及其对应的socket(HashMap),在有消息发送的时候再获取socket发送消息
2.读出-1的时候跳出循环,置该客户端异常。
附:InputStream 的输入流read方法解释
int java.io.InputStream
问题1: 当服务器网络异常(比如说网线一旦被拔出了),socket会抛出异常,可以实时监测到网络状况。客户端网线拔出也能实时监测到,但是客户端网线拔了,服务器端 不能监测到当前网络状态。
解决方案 :心跳机制 这个需要自己进一步去了解
目前我自己写得方案是,每隔30秒服务器向每个客户端发出一条消息,这样大概1分钟后对应的接收消息的线程会报异常,捕获这个异常,置指定客户端无效
问题2: 测试阶段发现cpu一直保持在100%,排除出两个地方
1.发送消息的进程,无限循环,查询数据库,系统压力过大。
2.接收消息线程,在读输入流的时候读出-1后继续读,导致无限循环,系统压力过大。
解决方案:1.干掉发送消息的线程,在内存中开一块区域存储指定客户端及其对应的socket(HashMap),在有消息发送的时候再获取socket发送消息
2.读出-1的时候跳出循环,置该客户端异常。
附:InputStream 的输入流read方法解释
int java.io.InputStream