的ServerSocket.accept()抛出SocketTimeoutException如果与空消息 [英] ServerSocket.accept() throwing SocketTimeoutException with null message

查看:924
本文介绍了的ServerSocket.accept()抛出SocketTimeoutException如果与空消息的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从ServerSocket对象获得的Socket的实例。但是,它始终打印

  SocketTimeoutException如果= NULL
 

还有就是我的code:

 尝试{
    //我们倾听新的连接
    Log.d(ShairPort,服务>>在TRY);
    尝试 {
        servSock =新的ServerSocket(端口);
    }赶上(IOException异常E){
        Log.d(ShairPort,服务>>在TRY#IO异常=+ e.getMessage());
        servSock =新的ServerSocket();
    }赶上(例外五){
        Log.d(ShairPort,服务>>在TRY·E xception =+ e.getMessage());
    }

    // DNS发射器(卓悦)
    byte []的HWADDR = getHardwareAdress();
    发射器=新BonjourEmitter(姓名,getStringHardwareAdress(HWADDR),口);

    //设置超时
    servSock.setSoTimeout(10000);


    Log.d(ShairPort,服务>> stopThread =+ stopThread);

    而(!stopThread){
        尝试 {
            // **********这是抛出异常*************** //
            Socket套接字= servSock.accept();
            servSock.setReuseAddress(真正的);
            Log.d(ShairPort,服务>>接到连接+ socket.toString());

            新的RTS presponder(HWADDR,插座)。开始();

        }赶上(SocketTimeoutException如果E){
            e.printStackTrace();
            Log.d(ShairPort,服务>> SocketTimeoutException如果=+ e.getMessage());
           // *********在这里我得到异常************** //

        }赶上(例外五){
            Log.d(ShairPort,服务>>异常=+ e.getMessage());
            servSock.close();
        }
    }
}赶上(IOException异常E){

    Log.d(ShairPort,服务>>尽量#CATCH IOException异常=+ e.getMessage());
    抛出新的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):在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:108)
02-06 18:14:08.300:W / System.err的(2245):在java.net.ServerSocket.implAccept(ServerSocket.java:203)
02-06 18:14:08.310:W / System.err的(2245):在java.net.ServerSocket.accept(ServerSocket.java:128)
02-06 18:14:08.310:W / System.err的(2245):在vavi.apps.shairport.LaunchThread.run(LaunchThread.java:99)
02-06 18:14:08.310:W / System.err的(2245):libcore.io.ErrnoException:产生的原因接受失败:EAGAIN(再试)
02-06 18:14:08.320:W / System.err的(2245):在libcore.io.Posix.accept(本机方法)
02-06 18:14:08.320:W / System.err的(2245):在libcore.io.BlockGuardOs.accept(BlockGuardOs.java:55)
02-06 18:14:08.320:W / System.err的(2245):在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:98)
02-06 18:14:08.320:W / System.err的(2245):... 3更多
 

解决方案

您正在设置服务器套接字十秒时间已过。

接受()方法,因此将抛出一个 SocketTimeoutException如果如果没有连接十秒内到达。

如果你不希望这样的行为,不设置超时时间,或提高了。

我不知道为什么你在获得当你自己设定在超过一定时间感到惊讶。

注:这是毫无意义的叫 setReuseAddress()上的服务器套接字就势必之后,更别说你接受一个新的连接每次。

I am trying to get an instance of Socket from ServerSocket Object. But, it always prints

SocketTimeoutException = null

There is my code:

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);

} 

Please let me know if I am doing anything wrong, so that I can resolve this issue.

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

解决方案

You're setting a ten second timeout on the server socket.

The accept() method will therefore throw a SocketTimeoutException if no connection arrives within ten seconds.

If you don't want that behaviour, don't set the timeout, or raise it.

I have no idea why you're surprised at getting a timeout when you're setting it yourself.

NB It is utterly pointless to call setReuseAddress() on the server socket after it is bound, let alone every time you accept a new connection.

这篇关于的ServerSocket.accept()抛出SocketTimeoutException如果与空消息的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆