私が取り組んでいるプログラムでは、私は2つのデバイスがBluetooth経由でお互いに話しています。アプリケーションが最初に起動されると、両方のデバイスが正常に接続されますが、接続が切断されて再初期化されると(つまり、サーバースレッドが強制終了されてから再作成されると)、BluetoothServerSocket
が接続を受け付けても失敗します。サーバー側では、私はBluetooth ServerSocketが受け付けていません
void handleConnection() throws Exception {
bss = BluetoothAdapter.getDefaultAdapter().listenUsingRfcommWithServiceRecord(Constants.BITMAP_NAME,
UUID.fromString(Constants.BITMAP_UUID));
running.set(true);
Logger.logE("accepting");
BluetoothSocket socket = bss.accept();
Logger.logE("accepted");
context.runOnUiThread(new Runnable() {
@Override
public void run() {
if (connectionCallback != null)
connectionCallback.onConnectionMade();
}
});
//handle connection in a loop...
try {
is.close();
is = null;
} catch (IOException ignored) {
Logger.exception(ignored);
}
try {
socket.close();
socket = null;
} catch (IOException ignored) {
Logger.exception(ignored);
}
}
を持っており、クライアント側で私は、サーバーを再起動し、メッセージ
java.io.IOException: read failed, socket might closed or timeout, read ret: -1
と外に、クライアントの回を再接続しようとした後
void handleConnection() throws Exception {
BluetoothSocket socket = connect.
createRfcommSocketToServiceRecord(UUID.fromString(Constants.BITMAP_UUID));
Logger.logE("preparing to connect");
socket.connect();
Logger.logE("Connected");
if (connectionCallback != null) {
context.runOnUiThread(new Runnable() {
@Override
public void run() {
connectionCallback.onConnectionMade();
}
});
Logger.logE("callback fired");
}
//Handle the connection...
Logger.logE("closing client");
try {
os.close();
os = null;
} catch (Exception ex) {
Logger.exception(ex);
}
try {
socket.close();
socket = null;
} catch (Exception ex) {
Logger.exception(ex);
}
}
を持っていますsocket.connect();
行にあります。クライアントを監視するときにLogcatにメッセージpreparing to connect
が表示され、サーバーを監視するときにメッセージaccepting
が表示されますが、その時点以降は進んでいません。
「接続が切断されて再初期化されたとき」、エラー(java.io.IOException:読み込みに失敗しました。ソケットが閉じられたかタイムアウト、読み込みret:-1)が発生しましたか? – solosodium
@solosodiumが更新されました。 – sjyn