BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #17770同步于 2011/3/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

server端怎么判断客户端的socket已经断开?

javame
2011/3/31镜像同步1 回复
我在客户端使用了outputStream.close();和socket.close();但是服务端还是一直在读,而且调用System.out.println("isClosed()"+socket.isClosed()); System.out.println("isConnected()"+socket.isConnected()); System.out.println("isInputShutdown()"+socket.isInputShutdown()); System.out.println("isOutputShutdown()"+socket.isOutputShutdown());都显示的是没断开,这咋整?
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
wks机器人#1 · 2011/3/31
我记得是getInputStream().read()返回-1吧,就是没有东西可以读了,也就是读到EOF,也就是一般像IOUtils.toByteArray(is)这种方法结束的时候吧。 这个程序似乎证实了这一点: package socket; import java.io.IOException; import java.io.InputStream; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SocketCloseTest { static class ServerThread extends Thread { public Lock listenLock = new ReentrantLock(); public Condition listenCondition = listenLock.newCondition(); public boolean started = false; @Override public void run() { try { ServerSocket ss = new ServerSocket(3344); started = true; listenLock.lock(); try { listenCondition.signalAll(); } finally { listenLock.unlock(); } Socket c = ss.accept(); InputStream inputStream = c.getInputStream(); while (true) { int read = inputStream.read(); System.out.println(read); if (read == -1) { break; } } c.close(); ss.close(); } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException, IOException { ServerThread st = new ServerThread(); st.start(); st.listenLock.lock(); try { while (!st.started) { st.listenCondition.await(); } } finally { st.listenLock.unlock(); } Socket cs = new Socket(); cs.connect(new InetSocketAddress("localhost", 3344)); cs.getOutputStream().write("Hello world!".getBytes("UTF-8")); cs.close(); } }