0

ServerSocket オブジェクトから Socket のインスタンスを取得しようとしています。しかし、それは常に印刷されます

SocketTimeoutException = null

私のコードがあります:

try {
    // We listen for new connections
    Log.d("ShairPort", "Service >> In TRY ");
    try {
        servSock = new ServerSocket(port);
    } catch (IOException e) {
        Log.d("ShairPort", "Service >> In TRY # IO Exception = " +e.getMessage());
        servSock = new ServerSocket();
    }catch(Exception e) {
        Log.d("ShairPort", "Service >> In TRY # E xception = " +e.getMessage());
    }

    // DNS Emitter (Bonjour)
    byte[] hwAddr = getHardwareAdress();
    emitter = new BonjourEmitter(name, getStringHardwareAdress(hwAddr), port);

    //Setting Timeout
    servSock.setSoTimeout(10000);


    Log.d("ShairPort", "Service >> stopThread = " +stopThread);

    while (!stopThread) {
        try {
            //********** This is throwing Exception ***************//
            Socket socket = servSock.accept();
            servSock.setReuseAddress(true);
            Log.d("ShairPort", "Service >> got connection from " + socket.toString());

            new RTSPResponder(hwAddr, socket).start();

        } catch(SocketTimeoutException e) {
            e.printStackTrace();
            Log.d("ShairPort", "Service >> SocketTimeoutException = " + e.getMessage());
           //********* here I am getting exception **************//         

        }catch(Exception e) {
            Log.d("ShairPort", "Service >> Exception = " + e.getMessage());
            servSock.close();
        }
    }
} catch (IOException e) {

    Log.d("ShairPort", "Service >> TRY # CATCH IOException = " + e.getMessage());
    throw new RuntimeException(e);

} 

この問題を解決できるように、何か問題がある場合はお知らせください。

02-06 18:14:08.300: W/System.err(2245): java.net.SocketTimeoutException
02-06 18:14:08.300: W/System.err(2245):     at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:108)
02-06 18:14:08.300: W/System.err(2245):     at java.net.ServerSocket.implAccept(ServerSocket.java:203)
02-06 18:14:08.310: W/System.err(2245):     at java.net.ServerSocket.accept(ServerSocket.java:128)
02-06 18:14:08.310: W/System.err(2245):     at vavi.apps.shairport.LaunchThread.run(LaunchThread.java:99)
02-06 18:14:08.310: W/System.err(2245): Caused by: libcore.io.ErrnoException: accept failed: EAGAIN (Try again)
02-06 18:14:08.320: W/System.err(2245):     at libcore.io.Posix.accept(Native Method)
02-06 18:14:08.320: W/System.err(2245):     at libcore.io.BlockGuardOs.accept(BlockGuardOs.java:55)
02-06 18:14:08.320: W/System.err(2245):     at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98)
02-06 18:14:08.320: W/System.err(2245):     ... 3 more
4

1 に答える 1

3

サーバーソケットに 10 秒のタイムアウトを設定しています。

したがって、 10 秒以内に接続が到着しない場合、accept()メソッドは をスローします。SocketTimeoutException

その動作が望ましくない場合は、タイムアウトを設定しないか、値を上げてください。

自分で設定しているときにタイムアウトが発生することに驚いた理由がわかりません。

setReuseAddress()注: 新しい接続を受け入れるたびに、サーバー ソケットがバインドされた後に呼び出すことはまったく無意味です。

于 2014-02-06T22:01:19.157 に答える