私の質問は: ソケットの OutputStream のシャットダウンを実行する方法はありますか、それとも nokia のように正しく/完全に実装されていませんか? (J2ME nokia 実装、nokia c6-00 でテスト済み、ストリームを閉じず、エミュレーターでテスト済み、正常に動作)
主な問題は、J2SE サーバー アプリケーションがストリームの末尾情報を取得しないことです。条件 read(buffer) == -1 が真になることはなく、空のストリームから読み取ろうとし、クライアントが強制終了されるまでハングします。これは、サーバー側アプリケーションの非常に非常に醜い回避策で機能します
Thread.sleep(10);//wait some time for data else you would get stuck........
while ((count = dataInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, count);
if (count != BUFFER_SIZE_1024 || dataInputStream.available() == 0) { //the worlds worst condition ever written... but works
break;
}
Thread.sleep(10);//wait for data input to get some data for dataInputStream.available() to return != 0 if client still sends data else you would not read all data......
}
しかし、この解決策は絶対に受け入れられません (nokia Java コーディングについて何も知らない、何かが足りない、または何らかの nokia-J2ME コーディング標準に似ているので、慣れるか、プラットフォームを変更する必要があります)
データを受信して処理した後、サーバーがクライアントに応答を送信するため、データを送信した後にクライアント ソケットを閉じることができません。
次のようになります: J2ME クライアント -> J2SE サーバー (クライアントが出力ストリームのシャットダウンを実行しないため、読み取りでハングアップ) -> J2ME
J2ME クライアントで dataOutputStream を閉じます - 効果なし setSocketOptions (KEEPALIVE、SNDBUF など) - 効果もエラーもありません
ターゲットデバイスで何も動作していないようです
申し訳ありませんが、Java との無意味な戦いの後、私は今少し怒っています。
解決策を探しましたが、うまくいかないようです
クライアントコード:
SocketConnection socketConnection = (SocketConnection) Connector.open("socket://" + ip + ":" + port);
int count;
byte[] buffer = new byte[BUFFER_SIZE_1024];
// client -> server
DataOutputStream dataOutputStream = new DataOutputStream(socketConnection.openDataOutputStream());
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
while ((count = byteArrayInputStream.read(buffer)) != -1) {
dataOutputStream.write(buffer, 0, count);
dataOutputStream.flush();
}
dataOutputStream.close();
byteArrayInputStream.close();