Android Lollipop Wifi Socket java.net.ConnectException ETIMEDOUT

时间:2015-05-20 06:35:56

标签: android sockets timeout

我正在尝试连接到这样的套接字:

    try {
        Server = "192.168.0.10";
        port = 7000;

        System.out.println("SOCKET: Create Socket: " + Server+ ":" + port);

        socket = new Socket(Server, port);

        System.out.println("SOCKET: Created Socket: " );

        out = socket.getOutputStream();
        in = socket.getInputStream();
        return true;
    } catch (IOException ex) {
        System.out.println("SOCKET: CATCH: " + ex.getLocalizedMessage());
        return false;
    }

这在我的Android 4.2设备上运行正常。如果我在Android Lollipop(5.x)上测试相同的代码,我将得到以下错误:

05-20 08:25:59.592: E/Con(8167): java.net.ConnectException: failed to connect to /192.168.0.10 (port 7000): connect failed: ETIMEDOUT (Connection timed out)
05-20 08:25:59.592: E/Con(8167):    at libcore.io.IoBridge.connect(IoBridge.java:124)
05-20 08:25:59.592: E/Con(8167):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183)
05-20 08:25:59.592: E/Con(8167):    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:163)
05-20 08:25:59.592: E/Con(8167):    at java.net.Socket.startupSocket(Socket.java:590)
05-20 08:25:59.592: E/Con(8167):    at java.net.Socket.tryAllAddresses(Socket.java:128)
05-20 08:25:59.592: E/Con(8167):    at java.net.Socket.<init>(Socket.java:178)
05-20 08:25:59.592: E/Con(8167):    at java.net.Socket.<init>(Socket.java:150)

在这两种情况下,我的Android设备都通过wifi与同一设备连接。有没有人知道Lollipop的问题?

谢谢!

编辑:解决方法: 好吧,我注意到一个奇怪的行为:如果我关闭我的移动互联网数据,正在创建Socket!但我只需要移动数据,因此它不是一个令人满意的解决方案...有关如何创建移动数据套接字的任何想法?

1 个答案:

答案 0 :(得分:1)

我们遇到了同样的问题。我们解决了这个问题:

ConnectivityManager conMan = (ConnectivityManager) Context.getSystemService(CONNECTIVITY_SERVICE);
NetworkRequest.Builder nb = new NetworkRequest.Builder();
nb.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);

conMan.requestNetwork(nb.build(), new ConnectivityManager.NetworkCallback() {

                    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
                    @Override
                    public void onAvailable(Network network) {
                        Socket s = new Socket();
                        network.bindSocket(s);

                        s.bind(new InetSocketAddress(server, port));
                    }
                });

使用Network.bindSocket(套接字),您可以主动选择要用于该套接字的网络。这是必要的,因为从Lollipop开始,系统默认网络是连接到互联网的网络。