socket通信问题解决

来源:互联网 发布:淘宝水果快递怎么收费 编辑:程序博客网 时间:2024/06/06 18:12
   威海的项目 负责socket通信的服务器端代码,与pb的客户端通信。服务器端对每个客户端开一个接收消息的线程,一个发送消息的线程,实时监测数据库中的某个列,查看是否有消息需要发送,服务器端需要实时获得客户端的状态,查看与客户端之间的网络连接状况。
 问题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()


 
 

原创粉丝点击