当前位置: 代码迷 >> J2SE >> java中socket调用close步骤之后输出流输出了什么
  详细解决方案

java中socket调用close步骤之后输出流输出了什么

热度:73   发布时间:2016-04-23 20:06:40.0
java中socket调用close方法之后输出流输出了什么?
本帖最后由 iamczb 于 2014-12-01 21:14:25 编辑
客户端:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
public class Client1 {
public static void main(String[] args) throws Exception{
Socket socket = new Socket("127.0.0.1",9900);
System.out.println ( "Connected with server " + socket.getInetAddress() + ":" + socket.getPort() );
BufferedReader input = new BufferedReader( new InputStreamReader(System.in));
BufferedReader serverInput = new BufferedReader( new InputStreamReader( socket.getInputStream() ));
PrintWriter output = new PrintWriter(socket.getOutputStream(),true);
System.out.println("请输入您发送的内容,按“.”发送:");
while(true) {
String str = input.readLine();
if( str.equals(".") ){
socket.close();
break;
}
output.println(str);
}

}
}

服务端:
public class Server1 {
public static void main(String[] args) throws Exception{
ServerSocket server = new ServerSocket(9900);
while(true) {
Socket socket = server.accept();
System.out.println ( "New connection accepted " + socket.getInetAddress() + ":" + socket.getPort() );
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream() ) );
PrintWriter output = new PrintWriter(socket.getOutputStream(),true);
while(true){
String str = input.readLine(); // str用于接收客户端的输入
if(str == null){
String s = "null";
System.out.println(s.equals(str));         //这里会输出false,说明str不是字符串“null”
System.out.println(str);             //这里会输出null
                                     System.out.println(str.toString() instanceof String);        //这里会报一个nullPointerException异常,说明str是一个空对象,为什么上一个语句还能输出来呢?
break;
}
else 
System.out.println(str);
}

System.out.println ( "Connection closed by client " + socket.getInetAddress());
socket.close();
break;
}


}
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------
问题是————socket的close方法到底会输出什么?
------解决思路----------------------
close不会输出什么,你从应用层调用close,最终反应到协议层的动作是:
1. 刷新缓冲区里的数据,将缓冲区里没有发送完的数据发送出去(没有特殊配置)
2. 向对方发送fin,这个动作对于应用层不可见
------解决思路----------------------
str==null
System.out.println(str);             //但是这里为什么还会在屏幕上输出null呢?

答:
println(str)  其实内部调用的是print(str);而print(str)的实现是:
 public void print(String s) {
if (s == null) {
    s = "null";
}
write(s);
    }

------解决思路----------------------
如果改成
String s;
System.out.println(s);   //则屏幕上不会输出null,而会抛出空指针异常

答: 不可能。变量s都没有正确初始化,编译都通不过的!

问:如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢
答:当对方调用close()时,传输层会发送FIN TCP报文,你的机器对应的传输层会收到这个FIN的TCP报文,处理后,你的应用层(即你的程序)再读取数据时,会发现对方已结束数据发送,再无数据可读了(即:已读到流的结束),因而JAVA程序代码 input.readLine() 将返回 null。
  相关解决方案