I am writing a multiplayer game for Android phones. Communication is via Bluetooth. I have managed to send bytes from one phone to the other using the input / output stream. Since I need to be able to transfer objects I want objectstreams. However, when I try to create an Objectstream with my streams, my program hangs on the instruction.
public class ConnectedThread extends Thread {
private static final String TAG = "Connected Thread";
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
private Handler mHandler;
private ObjectInputStream ois;
private ObjectOutputStream oos;
public ConnectedThread(BluetoothSocket socket,Handler h) {
mmSocket = socket;
mHandler = h;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (IOException e) { }
mmInStream = tmpIn;
mmOutStream = tmpOut;
Log.d(TAG,"attempting to create OIS");
try {
ois = new ObjectInputStream(mmInStream);
// The instruction new ObjectInputStream(mmInStream) NEVER FINISHES EXECUTING. It doesn't seem to throw an error, because I'd catch it. It just hangs at this instruction. None of the code below this line is ever executed.
} catch (Exception e) {
Log.e(TAG,"Error");
Log.d(TAG,e.getMessage());
e.printStackTrace();
}
Log.d(TAG,"attempting to create OOS");
try {
oos = new ObjectOutputStream(mmOutStream);
} catch (IOException e) {
Log.e(TAG,"IO exception for Output Stream, I have no idea what caused this");
Log.d(TAG,e.getMessage());
}
}
public void run() {.....}
What am I doing wrong?
Just construct the ObjectOutputStream,
and flush()
it, at both ends before constructing the ObjectInputStream.
You don't have to write any data of your own.
As EJP suggested ...
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.flush();
ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
Alright, I think I know what I did wrong. Object Streams are more complicated, it seems the ObjectInputStream constructor needs data to work on before it creates the the stream. I solved this problem by
This is what I'm using now (note that I also added a buffer):
public ConnectedThread(BluetoothSocket socket,Handler h) {
mmSocket = socket;
mHandler = h;
InputStream tmpIn = null;
OutputStream tmpOut = null;
// Get the input and output streams, using temp objects because
// member streams are final
try {
tmpIn = socket.getInputStream();
tmpOut = socket.getOutputStream();
} catch (Exception e) {
Log.d(TAG,"Error in getting Input Streams");
Log.w(TAG,e);
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
Log.d(TAG,"The socket is: " + mmSocket);
Log.d(TAG,"The streams are: " + mmInStream + mmOutStream);
Log.d(TAG,"attempting to create BufStreams");
final BufferedOutputStream bufo = new BufferedOutputStream(mmOutStream);
final BufferedInputStream bufi = new BufferedInputStream(mmInStream);
Log.d(TAG,"attempting to create OOS");
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);
}
Log.d(TAG,"done OOS");
if(oos==null)
{
Log.d(TAG,"oos is null!!!!");
}
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();
try {
Log.d(TAG,"writing and flushing 1");
oos.write(1);
oos.flush();
} catch (IOException e1) {
Log.d(TAG,"CaugtIOexception");
Log.w(TAG,e1);
}
Log.d(TAG,"sleeping to make sure stream is set up");
while (ois == null) {
try {
Thread.sleep(500);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}
Log.d(TAG, "done Sleeping");
// Read out the 1 to make sure everything is okay
int i = 0;
try {
i = ois.read();
} catch (IOException e) {
Log.d(TAG, "error reading");
e.printStackTrace();
}
Log.d(TAG,"I received an i of: " + i);
Log.d(TAG,"OO Streams set up");
}
public void run() {...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With