问题
在使用socket进行全双工通信时,原本以为输入流和输出流是分开关闭的,然而不管关闭哪个都会直接关闭socket;可以使用socket.shutdownInput()和socket.shutdownOutput()
程序代码
服务端
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args) throws Exception {
ServerSocket serverSocket = new ServerSocket(8080);
Socket socket = serverSocket.accept();
while( true ) {
try {
socket.sendUrgentData(0);
} catch (IOException e) {
// TODO Auto-generated catch block
break;
}
}
}
}
客户端
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;
public class Client {
public static void main(String[] args) throws IOException, Exception {
Socket socket = new Socket("127.0.0.1", 8080);
InputStream inputStream = socket.getInputStream();
// inputStream.close();
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
// reader.close();
}
}
使用InputStream
进入bebug模式,在执行到 inputStream.close()后进入SocketInputStream的close()方法,而这个方法是关闭socket流
使用BufferedReader
执行reader.close()后,最后也是执行SocketInputStream的close()方法;
reader.close()
现在来看看执行了reader.close()之后的流程,进入debug模式后
首先进入到BufferedReader的close()方法,然后这个方法调用的是Reader对象(in)的close()
然后进入in.close()里面看看,调用的是StreamDecoder对象(sd)的close方法
现在看看sd.close()方法里面-----好吧,看不了,不过经过不断的往下走,进入到了SocketInputStream,而这里也会把socket关闭掉;
至此,流程基本走完了,小总结一下,不管是调用inputStream.close()还是调用reader.close()都会把把socket流关闭掉(至于更深一层的还没理解)