2012-02-05 30 views
4

我想分享包含(字符串名称,地址,标题,...和字节[]图片)类型的东西的对象,当连接建立后,我的代码挂在objectinputstream readObject()函数。没有流式传输。任何人都可以请弄清楚我在做错事情。程序挂在ObjectInputStream readObject方法上。

private class ConnectedThread extends Thread { 
     private final BluetoothSocket mmSocket; 
     private final InputStream mmInStream; 
     private final OutputStream mmOutStream; 
     private ObjectOutputStream oos = null; 
     private ObjectInputStream ois = null; 

     public ConnectedThread(BluetoothSocket socket) { 
      Log.d(TAG, "create ConnectedThread"); 
      mmSocket = socket; 
      Log.d(TAG, "create a"); 
      InputStream tmpIn = null; 
      Log.d(TAG, "create b"); 
      OutputStream tmpOut = null; 

      // Get the BluetoothSocket input and output streams 
      try { 
       Log.d("connected thread constructor before inputstream", ""); 
       tmpIn = socket.getInputStream(); 
       Log.d("connected thread constructor inputstream", 
         tmpIn.toString()); 
       tmpOut = socket.getOutputStream(); 
       Log.d("connected thread constructor outputstream", 
         tmpOut.toString()); 
      } catch (IOException e) { 
       Log.e(TAG, "temp sockets not created", e); 
      } 

      mmInStream = tmpIn; 
      mmOutStream = tmpOut; 

      final BufferedOutputStream bufo = new BufferedOutputStream(
        mmOutStream); 
      final BufferedInputStream bufi = new BufferedInputStream(mmInStream); 

      Log.d(TAG, "attempting to create OOS"); 

      // ********* ObjectOutputStream ********** 

      try { 
       oos = new ObjectOutputStream(bufo); 

      } catch (StreamCorruptedException e) { 
       Log.d(TAG, "Caught Corrupted Stream Exception"); 
       Log.w(TAG, e); 

      } catch (IOException e) { 
       Log.d(TAG, "Caught IOException"); 
       Log.w(TAG, e); 
      } 

      // ********* ObjectInputStream ********** 

      Thread s = new Thread() { 
       public void run() { 
        Log.d(TAG, "attempting to create OIS"); 
        try { 
         ois = new ObjectInputStream(bufi); 
        } catch (StreamCorruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        Log.d(TAG, "completed OIS"); 
        if (ois == null) { 
         Log.d(TAG, "OIS is null"); 
        } 
       } 

      }; 
      s.start(); 

     } 

     public void run() { 
      Log.i(TAG, "BEGIN mConnectedThread"); 

我的代码在这一点上挂起,永远不会前进。

 `// Keep listening to the InputStream while connected 
     while (true) { 
      try { 
       Log.d("Connected thread run ", "start while"); 

       try { 

        Stuff obj_rcv = (Stuff) ois.readObject(); 
        Log.d("BTS", "rcv object " + obj_rcv.getName()); 

        Message msg2 = mHandler 
          .obtainMessage(RemoteBusinessCard.MESSAGE_READ); 
        Bundle bundle = new Bundle(); 
        bundle.putSerializable("person", obj_rcv); 
        msg2.setData(bundle); 
        mHandler.sendMessage(msg2); 

       } catch (ClassNotFoundException e1) { 
        // TODO Auto-generated catch block 
        e1.printStackTrace(); 
       } 
      } catch (IOException e) { 
       Log.e(TAG, "disconnected", e); 
       connectionLost(); 
       break; 
      } 
     } 
    } 

    /** 
    * Write to the connected OutStream. 
    * 
    * @param buffer 
    *   The bytes to write 
    */ 
    public void write(Stuff object) { 
     try { 
      Log.d("BTS", "inside write before" + object.getName()); 
      oos.writeObject(object); 
      Log.d("BTS", "inside write after" + object.getName()); 
      oos.flush(); 
      oos.close(); 

     } catch (IOException e) { 
      Log.e(TAG, "Exception during write", e); 
     } 
    } 

    public void cancel() { 
     try { 
      mmSocket.close(); 
     } catch (IOException e) { 
      Log.e(TAG, "close() of connect socket failed", e); 
     } 
    } 
}` 

回答

1

当你创建一个ObjectOutputStream你必须确保ObjectInputStream在插座的另一端也适当地创建,因为OutputStream的总发送确认包的InputStream和块,直到它得到一个答案。

+0

如果ObjectOutputStream中首先在两个主设备和从设备然后执行怎么可能的ObjectInputStream将收到的数据,因为它尚未初始化! – Ahmed 2012-02-06 08:16:32

+0

你必须轮流创建它们。例如客户端上的InputStream和服务器上的OutputStream,然后是客户端上的OutputStream和服务器上的InputStream。如同时在相反的流中。 – j0ntech 2012-02-06 19:05:22

1

这不是java的工作方式。 你必须创建两个单独的线程输入和输出流为您的逻辑工作。

0
outStream = new ObjectOutputStream(socket.getOutputStream()); 
outStream.flush(); 
inStream = new ObjectInputStream(socket.getInputStream()); 

第一,冲洗创建的OutputStream和无论是在服务器和客户端的InputStream

相关问题