工程里遇到了需要判断Socket是否已经关闭的问题,使用 public boolean isAlive(){ if(mSocket.equals(null)||mSocket.isClosed()||!mSocket.isConnected()||mSocket.isInputShutdown()||mSocket.isOutputShutdown()){ MyLog.d("mSocket.isConnected()"+mSocket.isConnected()); return false; }else{ MyLog.d("mSocket.isConnected()"+mSocket.isConnected()); return true; } } 毫无作用,随后查看了网上先关解决办法,发现Socket中有一个方法void sendUrgentData(0xFF)当对方SO_OOBINLINE属性没有打开时,就会自动舍弃这个字节,而SO_OOBINLINE属性默认情况下就是关闭的,但是只要能够发送到对方Socket,sendUrgentData(0xFF)方法就不会报错,只要catch一下IOException就OK了,当对方关掉了Socket之后就会进入catch,问题迎刃而解。 try{ mSocket.sendUrgentData(0xFF); }catch(IOException e){ Log.d(e+":要关掉了阿 !"); mSocket.close(); } 当socket断掉之后,抛出java.net.socketexception broken pipe异常,没有问题。