0

サーバーをより安定させようとしています。これは、サーバー ソケットおよびソケット クラスを使用します。情報の転送は、ストリーム クラスを使用して行われます。

デバッグを行うと、しばらくの間すべてのオンスが解放されることがあります。

クライアントがソケット接続を行っただけで、データを送信しなかったか、サーバーがクラスInputStreamの読み取りメソッドでサーバーがフリーズすることを期待していたよりも少ないことがわかりました。

読み取りメソッドをタイムアウトさせる方法はありますか? ドキュメント イオンは時間のふくれっ面については語っていませんが、情報データが友好的であることをブロックすると述べています。

読み取りがタイムアウトできない場合、ソケット接続を介してデータを読み取り、クライアントがデータを送信しなくなった場合にフリーズしない別の方法はありますか????

データの読み込みとフリーズする場所のコード スニペット

public String ReadLine(){
    String out="";

    // read in one line
    try{
        request = new StringBuffer(1000);
        boolean f=true;
        while(true){
            int c=in.read(); // WILL FREEZ HEAR IF CLIENT NO LONGER CONNECTED OR SENDING DATA
            if (c=='\r'){
                // next should be a \n
                c=in.read(); 

    //.....
4

3 に答える 3

0

ソケットを使用している場合は、ソケットにSO_TIMEOUT値を設定する必要があります。これにより、読み取りがタイムアウトして。をスローできるようになりますInterruptedIOException

Socket.setSoTimeout見る方法です。タイムアウトは、ソケットから取得した入力ストリームではなく、ソケット自体に設定されることに注意してください。

于 2012-07-10T17:58:53.283 に答える
0

完全なコードを投稿してください。ただし、InputStream を使用している場合、これはブロッキング I/O メソッドであり、クライアントが接続されている限り「フリーズ」します。クライアント接続をドロップすると、ブロックが解放されます。これを心配する代わりに、I/O を処理する別のスレッドを作成する必要があります。また、ここでの本当の問題は、なぜクライアントがメッセージを送信しないのかということです。

于 2012-07-10T17:46:33.727 に答える
0

試してみませんか...

int c = 0;
while((c = in.read()) != -1) {
...
}

問題が解決するかどうかを確認します。

于 2012-07-10T17:52:00.450 に答える