返回信息流我在客户端使用了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());都显示的是没断开,这咋整?
这是一条镜像帖。来源:北邮人论坛 / java / #17770同步于 2011/3/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
server端怎么判断客户端的socket已经断开?
javame
2011/3/31镜像同步1 回复
订阅后,新回复会通过你的通知中心匿名送达。
1 条回复
我记得是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();
}
}