Program hangs in readObject ObjectInputStream method.

I want to share an object of type Stuff that contains (line name, address, name, ... and byte [] image), when the connection is established after this, my code hangs in the objectinputstream readObject () function. No streaming occurs. Can someone please find out where I am doing wrong.

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"); 

My code hangs at this point, never move forward.

  `// 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); } } }` 
+4
source share
3 answers

When creating an ObjectOutputStream you must make sure that the ObjectInputStream on the other end of the socket is also correctly created, because outputStream always sends a confirmation packet to inputStream and blocks until it receives a response.

+1
source

this is not how java works. You MUST create two separate threads for input and output threads for your logic to work.

+1
source
 outStream = new ObjectOutputStream(socket.getOutputStream()); outStream.flush(); inStream = new ObjectInputStream(socket.getInputStream()); 

create output streams first, flush and inputstream both on the server and on the client

0
source

Source: https://habr.com/ru/post/1394848/


All Articles