2017-07-28 1 views
1

私はSocketServerを使用してWebページ、JSスクリプトなどを生成しようとしています。次のようになります。ServerSocketはエラーなく接続を失います

ServerSocket serverSocket = new ServerSocket(port); 
while (!stop) { 
    Socket socket = serverSocket.accept(); 
    new Thread() { @Override ... 
     InputStream inputStream = socket.getInputStream(); 
     OutputStream outputStream = socket.getOutputStream(); 
     // And here we reading requests and writing responses 
    } }.start(); 
} 

ほとんどの場合、動作します。 Chromeはこのサーバーからページを正常に受信します。

しかし!今日私は気づいたことがあります。もし誰かがすばやくたくさんのリクエストをすると、サーバーは接続を拒否し始めます。だからクロムは私にこれを与える:

net::ERR_SOCKET_NOT_CONNECTED 

私の試合ではエラーが表示されません。

私は間違っていますか?

+0

完了したらソケットを閉じていますか? –

+0

あまりにもエラーなしで、ソケットが閉じられています – user1748526

答えて

0

問題は約InputStream.available()でした。ゼロを返し、私は時々空のリクエストを扱いました。ご協力いただきありがとうございます。

0

何らかの理由でクライアントとサーバー間のネットワーク接続が失われた場合は、ソケットで何かを読み書きしようとすると通知されます。

この種のエラーを処理し、新しい接続を再度確立しようとするコードを追加する必要があります。

+0

しかし、私は常に何かを読み書きしようとします。そして、私は誤りを得ていません。 – user1748526

+0

ネットワークには障害があります。ソケットを確立するコードを書くことはできませんし、ソケットが常に動作することを確認することはできません。だからコードは、接続が失われる可能性を処理するために必要です。 –

+0

Hmm。多分私は何かを理解していないかもしれませんが、私が言ったように、私は間違いがないのです。どのように接続の紛失を処理するには? – user1748526

1

これは奇妙なことです。なぜなら、失敗することを知らせるために必要なことをwaaay toooo maaanyに発行しなければならないからです。おそらく、私たちにあなたのコードをすべて表示していないでしょうか?いずれの場合においても

は、ここでは、おそらく何が起こっているかである。

あなたはそれを価値backlogため50を渡し、new ServerSocket(int port, int backlog, InetAddress bindAddr)コンストラクタに内部的にデリゲートを使用しているServerSocket(int port)コンストラクタ。これは、サーバーがビジー状態のときに保留にできる接続の数です。

.accept()コールが返されてから、次の呼び出しが.accept()になるまで、サーバーはビジー状態です。サーバーが.accept()への呼び出しの間に多くの作業を行う場合(つまり、新しいスレッドを作成する呼び出しに時間がかかる場合)、その間にサーバーは応答しなくなり、その間に十分な接続が到着した場合、 50日を過ぎた接続は拒否されます。

したがって、サーバーが.accept()への呼び出しの間にこのような長い時間がかからないように、より大きなバックログを提供するか、(おそらく)コードを再構成します。

+0

Hmm。私はこれが事実ではないと思う。まず第一に、 'accept()'の間で始まる新しいスレッド以外は何もありません。そして2番目に - 接続数が50より少なくなります。約10ですか、あるいはChromeがいくつか余分なリクエストをしていますか?とにかく、私はバックログを増やそうとします。 – user1748526

+0

いいえ、助けていない:( – user1748526

+0

大丈夫、それは試してみる価値があった。誰かが良いアイデアを思い付くことを願っています。 –

関連する問題