サーバーに「安定した」接続が必要です。サーバーへの「安定した」TCP接続が必要
クライアントは、5(10、N)秒ごとにサーバーに接続しようとします。
正常に接続すると、クライアントはサーバーからデータを受信します。
サービスの中断(サーバーのシャットダウンなど)の場合は、手順1に進みます。私はテスト方法
:
を私は私が停止
(クライアントがサーバーからデータを取得することを確認するために)クライアントを起動し、サーバーに
を開始サーバー
約200回のクライアント試行を待ちますサーバーに接続します。
サーバーを再起動します。
サーバーはデータを送信しますが、クライアントはデータを取得しません。 socket.connect(...)
が成功しましたが、 socket.getInputStream().read(byte[])
ではありません。のThread
ブロックです。
//socket.setSoTimeout(500);
が、その後input.read(..)
がTimeoutException
をスロー:私は、この行のコメントを解除した場合
。
しかし、サーバーはクライアントからデータを受信します。
どこが間違っていますか?おかげさまで クライアントコードの
パート:J2SEオン
private void initSocket() {
try {
if (socket == null || socket.isClosed() == true
|| socket.isConnected() == false) {
socket = new Socket();
// socket.setSoTimeout(500);
InetSocketAddress socketAddress = new InetSocketAddress("192.168.1.3"
, 12344);
notifyDataListener(4);
socket.connect(socketAddress, 500);
notifyDataListener(5);
}
} catch (Throwable t) {
System.err.println(t);
}
}
private void closeSocket() {
try {
if (socket != null && socket.isClosed() == false) {
socket.close();
}
} catch (Throwable t) {
System.err.println(t);
}
}
private byte[] buffer = new byte[1024];
public void run() {
while (isActive) {
try {
notifyDataListener(1);
initSocket();
InputStream input = socket.getInputStream();
int length = input.read(buffer);
if (length < 0) {
throw new EOFException("Was got -1");
}
notifyDataListener(2);
} catch (Throwable t) {
closeSocket();
notifyDataListener(3);
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
}
}
}
}
同じコードが正常に動作します。多くの間違った試行後に接続が修復されます。 Androidにはソケットの制限がありますが(FileDescriptior?)、それを受け取りますが、後で解放しないようです。
私はあなたのコードを試してみましたが、私のデバイス上でうまく動作します(もちろん別のサービスアドレスを使用しています)。 – Shlublu