我正在制作一艘Battleships游戏,我想发送一个名为Ships的类的数组(其中包含船名,大小,旋转与否以及坐标的arraylist等)。我用Google搜索并查看了堆栈溢出,我基本上需要序列化数组,但这就是我被困住的地方。我需要使用ObjectOutputStream,但是我如何将其包含在下面的代码中(取自android dev网站)。注意我已经使ship class实现了serializable。提前致谢
public class ConnectedThread extends Thread {
private final BluetoothSocket mmSocket;
private final InputStream mmInStream;
private final OutputStream mmOutStream;
public ConnectedThread(BluetoothSocket socket) {
Log.d(TAG, "connectedthread started");
// mHandler.obtainMessage(TEST).sendToTarget();
mmSocket = socket;
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) {
Log.e(TAG, "temp sockets not created");
}
mmInStream = tmpIn;
mmOutStream = tmpOut;
}
public void run() {
Log.i(TAG, "Begin mConnectedThread");
byte[] buffer = new byte[1024]; // buffer store for the stream
int bytes; // bytes returned from read()
// Keep listening to the InputStream until an exception occurs
while (true) {
try {
// Read from the InputStream
bytes = mmInStream.read(buffer);
// Send the obtained bytes to the UI activity
Log.i(TAG, "reaaaad msg");
mHandler.obtainMessage(SetUpGame.MESSAGE_READ2, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
Log.e(TAG, "disconnectd");
break;
}
}
}
/*
* Call this from the main activity to send data to the remote
* device
*/
public void write(byte[] buffer) {
try {
mmOutStream.write(buffer);
Log.i(TAG, "writeeee msg");
mHandler.obtainMessage(SetUpGame.MESSAGE_WRITE, -1,-1, buffer).sendToTarget();
} catch (IOException e) {
Log.e(TAG, "Exception during write");
}
}
/* Call this from the main activity to shutdown the connection */
public void cancel() {
try {
mmSocket.close();
} catch (IOException e) {
Log.e(TAG, "close of connect socket failed");
}
}
}
和我的经纪人:
final Handler mHandler = new Handler() {
@Override
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MESSAGE_READ2:
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
break;
case MESSAGE_WRITE:
byte[] writeBuf = (byte[]) msg.obj;
String writeMessage = new String(writeBuf);
//Toast.makeText(getApplicationContext(),"Me:" + writeMessage, Toast.LENGTH_SHORT).show();
break;
答案 0 :(得分:5)
在上面的代码中,您可以从连接的套接字获取输入/输出流。
现在,您可以使用这些流向/从套接字流式传输数据。
具体取决于您要传输的数据类型。在这种情况下,您有一个可序列化的Object要发送,因此您将流包装在一个过滤器中,该过滤器使流适应于Objects:ObjectOutputStream / ObjectInputStream ...
ObjectOutputStream oos = new ObjectOutputStream( mmOutStream );
for (Ship ship: ships)
oos.writeObject( ship );
此代码遍历Ships数组,将每个船只写入流(因此,写入蓝牙套接字)。
接收方是相同的,还有一个额外的复杂因素:您不一定知道何时停止或要读取什么。处理这个问题有各种各样的方案,并且有专门针对此问题的SO问题。 Android开发人员指南的蓝牙页面包含以下示例代码: http://developer.android.com/guide/topics/connectivity/bluetooth.html