Socket doesn't throw exception in Android

. 2 min read

Several threads from STACK OVERFLOW:

We have a simple client server architecture between our mobile device and our server both written in Java. An extremely simple ServerSocket and Socket implementation. However one problem is that when the client terminates abruptly (without closing the socket properly) the server does not know that it is disconnected. Furthermore, the server can continue to write to this socket without getting any exceptions. Why?
According to documentation Java sockets should throw exceptions if you try to write to a socket that is not reachable on the other end!

Another,

If I put a nonsense url no exception is thrown and none of the rest of my code is executed not even the rest of the asynctask that called the method that connects.

Typically:

    try {
        socket.connect(new InetSocketAddress(address, port), 2000);
    } catch (Exception e) {
        //will never reach this block
    }

I am facing the same problem. I have tried every means below these questions, but it still did not work. I found that some apps downloaded from Google Play has the same problem that it could connect and send data to a invalid address.

There is no doubt that there is a bug of Android SDK, could found in this thread: no IOException on socket read/write after remote close as well.

My solution is to switch the minSdkVersion to a newer version such as 21 and to use the latest build tools.

Android 开发过程中,遇到一个比较诡异的问题:Socket.connect 即使连接失败也不会抛出任何异常,这个问题在 STACK OVERFLOW 上已经有非常多的讨论,但我翻了无数答案没有找到合适的解决方法。最后可以确认这是Android历史遗留的一个臭虫,至于在哪个版本SDK中被修复了还不得而知,我最后将 minSdkVersion 从15换到21解决了这个问题,代价就是APP只能在 Android 5.0 以后的版本上运行。

强迫症这个病,得治。