简体   繁体   English

对于Android平台上的蓝牙套接字,无法使用InputStream创建ObjectInputStream

[英]Cannot create ObjectInputStream with InputStream for a Bluetooth Socket on the Android Platform

I am writing a multiplayer game for Android phones. 我正在为Android手机编写多人游戏。 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. 但是,当我尝试使用我的流创建一个Objectstream时,我的程序挂起了指令。

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 . // 指令new ObjectInputStream(mmInStream)永远不会完成执行 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. 构造ObjectInputStream. 之前 ObjectOutputStream,只需构造ObjectOutputStream,并在两端flush() ObjectInputStream. You don't have to write any data of your own. 您不必编写自己的任何数据。

As EJP suggested ... 正如EJP建议的......

        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. 对象流更复杂,似乎ObjectInputStream构造函数需要在创建流之前处理数据。 I solved this problem by 我解决了这个问题

  1. Creating the OOS. 创建OOS。
  2. Start the constructor for the OIS in a seperate thread. 在单独的线程中启动OIS的构造函数。
  3. Write some data into the OOS and flush it. 将一些数据写入OOS并冲洗它。
  4. Wait for the OIS to become initialized before reading from it. 在读取之前等待OIS初始化。

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() {...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM