了解如何在读取套接字数据时检测到断开连接(InputStream)

时间:2012-08-10 21:13:04

标签: java sockets stream network-programming

我有一个不断从InputStream读取数据的线程。 InputStream数据来自蓝牙插槽。以前,我没有在InputStream读取语句周围使用if(mmInStream.available()> 0),当蓝牙套接字消失(有人关闭设备)时,mmInStream.read将抛出IOException然后我可以处理我的断开逻辑。确定何时发生断开连接的最佳方法是什么?

0xEE的第一个字节告诉我它是数据包的领导者,第二个字节告诉我读取的长度。

public void run() {
            byte[] tempBuffer = new byte[1024];
            byte[] buffer = null;
            int byteRead=0;
        long timeout=0;
        long wait=100;

            while (true) {
                try {
                timeout = System.currentTimeMillis() + wait;
                    if(mmInStream.available() > 0) {
                        while((mmInStream.available() > 0) && (tempBuffer[0] != (byte) 0xEE) && (System.currentTimeMillis() < timeout)){
                        byteRead = mmInStream.read(tempBuffer, 0, 1);
                    }
                    if(tempBuffer[0] == (byte) 0xEE){
                        timeout = System.currentTimeMillis() + wait; 
                        while(byteRead<2 && (System.currentTimeMillis() < timeout)){
                            byteRead += mmInStream.read(tempBuffer, 1, 1); 
                        }
                    }
                    timeout = System.currentTimeMillis() + wait; 
                    while((byteRead<tempBuffer[1]) && (System.currentTimeMillis() < timeout)){
                        byteRead += mmInStream.read(tempBuffer, byteRead, tempBuffer[1]-byteRead); 
                    }
                    }

                    if(byteRead > 0){
                        //do something with the bytes read in               
                    } 
                }

                catch (IOException e) {
                    bluetoothConnectionLost();
                    break;
                }
            }

        }

3 个答案:

答案 0 :(得分:1)

你不需要所有这个malarkey with available()。只需使用setSoTimeout设置读取超时,读取,检测读取返回-1,使用读取返回的计数如果&gt; 0而不是假设缓冲区已填满,捕获SocketTimeoutException以检测读取超时,并捕获IOException以检测其他破坏。

答案 1 :(得分:0)

看完文档后,我认为就是这样:

public void run() {
    byte[] tempBuffer = new byte[1024];
    int byteRead = 0;

    while (true) {
        try {
            bytesRead = mmInStream.read(tempBuffer, 0, tempBuffer.length);
            if (bytesRead < 0)
                // End of stream.
                break;

            // Do something with the bytes read in. There are bytesRead bytes in tempBuffer.
        } catch (IOException e) {
            bluetoothConnectionLost();
            break;
        }
    }
}

答案 2 :(得分:0)

我想是这样的:

 void fun(){
   isOpen = true;
   try{
      InputStream stream = socket.getInputStream();
      while(isOpen){
         byte[] buf = new byte[8];
         int pos = stream.read(buf);
         if (pos < 0) {
            throw new IOException();
         }
         //dosomething...
      }
  }catch(IOException e) {
    isOpen  = false;
  }finally{
    //do dispose here
  }
}