最近在做一个关于Socket的项目,看了很多示例代码,结合我的需求,开发到一半的时候,发现了一个问题.
需求:客户端连接服务端,每隔一分钟客户端发送数据包给服务端,服务端验证数据包的正确性,如果正确服务端不发送任何消息给客户端,客户端就一直每隔1分钟发送数据包到服务端,如果服务端验证数据包错误,那就发送一个消息给客户端,让其重新发送.现在的问题:我的客户端在发送完毕数据后,验证inputStream数据流是否有数据,但是如果服务端验证正确之后不发送数据给我,所以程序就一直在读这个流,不是超时就是一直在读,我不知道如何用程序去判断,服务端有没有发送消息过来.关键代码:
while(true)
{
//输出流
BufferedOutputStream bufferedOutputStream = socketServer.getSocketOutputStream();//输入流
BufferedInputStream bufferedInputStream = socketServer.getSocketInputStream();//发送的内容
byte[] dataPacketByteArray = new byte[32];//写入发送
bufferedOutputStream.write(dataPacketByteArray);
bufferedOutputStream.flush();//读取输入流
int count = 0;
while (bufferedInputStream.read() != -1)
{
commonStream.write(buffer, 0, count);
System.out.println(commonStream.toString());
commonStream.reset();
}
//每隔1分钟发送一次
Thread.sleep(60000);
}
///////问题代码处:
bufferedInputStream.read() 现在程序就会停在这个地方不动了.
当客户端发送的数据正确,服务端不会发送消息过来,这里就读不到消息,就会一直停在这里等待,直到超时,不知道如何解决.备注:这个服务端不是我们开发的,是上级领导开发的,需求不能变,不能商量,不知道怎么解决?

解决方案 »

  1.   

    Socket类的
    setSoTimeout
    public void setSoTimeout(int timeout)
                      throws SocketException启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。
      

  2.   

    开一个Timer 每隔一分钟检测