socket通信问题解决
来源:互联网 发布:淘宝水果快递怎么收费 编辑:程序博客网 时间:2024/06/06 18:12
问题1: 当服务器网络异常(比如说网线一旦被拔出了),socket会抛出异常,可以实时监测到网络状况。客户端网线拔出也能实时监测到,但是客户端网线拔了,服务器端 不能监测到当前网络状态。
解决方案 :心跳机制 这个需要自己进一步去了解
目前我自己写得方案是,每隔30秒服务器向每个客户端发出一条消息,这样大概1分钟后对应的接收消息的线程会报异常,捕获这个异常,置指定客户端无效
问题2: 测试阶段发现cpu一直保持在100%,排除出两个地方
1.发送消息的进程,无限循环,查询数据库,系统压力过大。
2.接收消息线程,在读输入流的时候读出-1后继续读,导致无限循环,系统压力过大。
解决方案:1.干掉发送消息的线程,在内存中开一块区域存储指定客户端及其对应的socket(HashMap),在有消息发送的时候再获取socket发送消息
2.读出-1的时候跳出循环,置该客户端异常。
附:InputStream 的输入流read方法解释
int java.io.InputStream.read(byte[] b, int off, int len) throws IOException
Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many as len bytes, but a smaller number may be read. The number of bytes actually read is returned as an integer.
This method blocks until input data is available, end of file is detected, or an exception is thrown.
If len is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at end of file, the value -1 is returned; otherwise, at least one byte is read and stored into b.
The first byte read is stored into element b[off], the next one into b[off+1], and so on. The number of bytes read is, at most, equal to len. Let k be the number of bytes actually read; these bytes will be stored in elements b[off] through b[off+k-1], leaving elements b[off+k] through b[off+len-1] unaffected.
In every case, elements b[0] through b[off] and elements b[off+len] through b[b.length-1] are unaffected.
The read(b, off, len) method for class InputStream simply calls the method read() repeatedly. If the first such call results in an IOException, that exception is returned from the call to the read(b, off, len) method. If any subsequent call to read() results in a IOException, the exception is caught and treated as if it were end of file; the bytes read up to that point are stored into b and the number of bytes read before the exception occurred is returned. The default implementation of this method blocks until the requested amount of input data len has been read, end of file is detected, or an exception is thrown. Subclasses are encouraged to provide a more efficient implementation of this method.
Parameters:
b the buffer into which the data is read.
off the start offset in array b at which the data is written.
len the maximum number of bytes to read.
Returns:
the total number of bytes read into the buffer, or -1 if there is no more data because the end of the stream has been reached.
Throws:
IOException - If the first byte cannot be read for any reason other than end of file, or if the input stream has been closed, or if some other I/O error occurs.
NullPointerException - If b is null.
IndexOutOfBoundsException - If off is negative, len is negative, or len is greater than b.length - off
See Also:
java.io.InputStream.read()
- socket通信问题解决
- flex和socket通信的跨域问题解决方案
- Android socket通信,读去中文汉字乱码问题解决。
- java和vb进行socket通信以及java与c/c++/oc 进行socket通信时汉字字符串编码问题解决
- Socket通信
- Socket通信
- socket通信
- Socket通信
- Socket通信
- socket通信
- socket通信
- socket通信
- socket 通信
- socket通信
- SOCKET通信
- Socket通信
- 通信 socket
- socket 通信
- sqlldr各种问题记录
- VB.Net C#代码转换工具
- C#与vb6 com组件的互相调用方法
- 移动开发者大会获奖的五款应用简评
- Oracle中session 与 connect 连系与区别
- socket通信问题解决
- ORACLE EBS基础设置要点简介(E)
- ORACLE EBS 系统主数据管理(A)
- string char*
- C#结构体
- uboot 命令使用教程(uboot参数设置)
- 范文澜对联
- 【English】一些学习方法
- 如何在ubuntu上安装vim