Java: различение входных данных в InputStream - PullRequest
1 голос
/ 24 ноября 2011

У меня есть InputStream, который работает в потоке и читает все данные, которые передаются по сети. У меня вопрос: как мне отличить байты, полученные от объекта InputStream? например если полученные байты указывают на объект Car, сделайте что-нибудь, если полученные байты указывают на объект Person, сделайте что-нибудь еще.

Спасибо.

РЕДАКТИРОВАТЬ: вот фрагмент моего кода. это выглядит нормально? извините, я новичок в сетевом программировании.

private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final ObjectOutputStream mmObjOutStream;

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

            // Get the BluetoothSocket input and output streams
            try {
                tmpIn = socket.getInputStream();
                tmpOut = new ObjectOutputStream(socket.getOutputStream());
            } catch (IOException e) {
                Log.e(TAG, "temp sockets not created", e);
            }

            mmInStream = tmpIn;
            mmObjOutStream = tmpOut;
        }

        public void run() {
            Log.i(TAG, "BEGIN mConnectedThread");
            byte[] buffer = new byte[1024];
            int bytes;

            // Keep listening to the InputStream while connected
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);
                    Log.i(TAG, "PERFORMING MESSAGE READ");
                    // Send the obtained bytes to the UI Activity
                    mHandler.obtainMessage(GameboardResourceActivity.MESSAGE_READ, bytes, -1, buffer)
                            .sendToTarget();
                } catch (IOException e) {
                    Log.e(TAG, "disconnected", e);
                    connectionLost();
                    break;
                }
            }
        }

        /**
         * Write to the connected OutStream.
         * @param buffer  The bytes to write
         */
        public void write(CardResource buffer) {
            try {
                mmObjOutStream.writeObject(buffer);
                System.out.println("Reached here at least........");
                // Share the sent message back to the UI Activity
                mHandler.obtainMessage(GameboardResourceActivity.MESSAGE_WRITE, -1, -1, buffer)
                        .sendToTarget();
            } 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);
            }
        }
    }

Ответы [ 2 ]

1 голос
/ 24 ноября 2011

Вы можете передать входной поток сокетов непосредственно в конструктор для ObjectInputStream:

ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());

while ((obj = inputStream.readObject()) != null) {
    if (obj instanceof Person) {   
        System.out.println(((Person)obj).toString());
    }
}

EDIT

Поскольку состояние комментариев преждевременно завершится, если вы передадите нулевое значениев ваш ObjectOutputStream на другом конце.Лучше всего защититься от этого, нулевые значения никогда не получатся неожиданно получить.

1 голос
/ 24 ноября 2011

Ну, вы должны знать, что протокол вашего приложения, чтобы понять это.Похоже, что другой конец использует сериализацию, которую вы должны прочитать.Посмотрите Javadoc для ObjectOutputStream и ObjectInputStream.Что вам нужно, так это ObjectInputStream.readObject (), если это предположение верно.Если это не так, вам просто нужно выяснить, что они вам отправляют, и действовать соответствующим образом, возможно, с DataInputStream для обработки различных типов данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...