java中socket调用close方法之后输出流输出了什么? 本帖最后由 iamczb 于 2014-12-01 21:14:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 close不会输出什么,你从应用层调用close,最终反应到协议层的动作是:1. 刷新缓冲区里的数据,将缓冲区里没有发送完的数据发送出去(没有特殊配置)2. 向对方发送fin,这个动作对于应用层不可见 如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢(因为 if 块里的打印语句被执行了),小白我还是不太明白什么是协议层,什么是应用层,可以解释得通俗一点吗?主要问题是服务端的下面两句:System.out.println(s.equals(str)); //现在我知道了只要对于任何非空引用值 x,x.equals(null) 都应返回 false,说明str==nullSystem.out.println(str); //但是这里为什么还会在屏幕上输出null呢?如果改成String s;System.out.println(s); //则屏幕上不会输出null,而会抛出空指针异常,为什么close返回的空对象就可以被调用呢?新人第一次发帖求助,万能的CSDN是不会让小白失望的吧~~ str==nullSystem.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。 如果改成String s;System.out.println(s); //则屏幕上不会输出null,而会抛出空指针异常答: 不可能。变量s都没有正确初始化,编译都通不过的!问:如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢答:当对方调用close()时,传输层会发送FIN TCP报文,你的机器对应的传输层会收到这个FIN的TCP报文,处理后,你的应用层(即你的程序)再读取数据时,会发现对方已结束数据发送,再无数据可读了(即:已读到流的结束),因而JAVA程序代码 input.readLine() 将返回 null。-------------------------------------------------------------------------------------------------------------------------------------------------------终于明白问题所在了,原来是我把null对象和没有初始化的对象两个定义搞混了,看了您对print方法的解释才醒悟,感谢大神指点! 視頻轉換軟件 java面向对象题,大家帮我看看! 关于插件运行环境的设置~ 想编写一个通过java读取计算机CPU,内存信息等的程序,请高手提示一下 最近想研究JDK中的jar 如何改变tomcat的端口号 工厂方法,怎么也没搞明白,哪位大哥帮小弟解释解释 为什么不换行 求救,一个有关Applet的问题. 谁知道MS SQL Server 2000的jdbc driver到哪里下载? List<> list 中,怎样得到某一值? 多重为空判断怎么写才好?
1. 刷新缓冲区里的数据,将缓冲区里没有发送完的数据发送出去(没有特殊配置)
2. 向对方发送fin,这个动作对于应用层不可见
主要问题是服务端的下面两句:
System.out.println(s.equals(str)); //现在我知道了只要对于任何非空引用值 x,x.equals(null) 都应返回 false,说明str==null
System.out.println(str); //但是这里为什么还会在屏幕上输出null呢?如果改成
String s;
System.out.println(s); //则屏幕上不会输出null,而会抛出空指针异常,为什么close返回的空对象就可以被调用呢?新人第一次发帖求助,万能的CSDN是不会让小白失望的吧~~
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。
String s;
System.out.println(s); //则屏幕上不会输出null,而会抛出空指针异常答: 不可能。变量s都没有正确初始化,编译都通不过的!问:如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢
答:当对方调用close()时,传输层会发送FIN TCP报文,你的机器对应的传输层会收到这个FIN的TCP报文,处理后,你的应用层(即你的程序)再读取数据时,会发现对方已结束数据发送,再无数据可读了(即:已读到流的结束),因而JAVA程序代码 input.readLine() 将返回 null。
-------------------------------------------------------------------------------------------------------------------------------------------------------
终于明白问题所在了,原来是我把null对象和没有初始化的对象两个定义搞混了,看了您对print方法的解释才醒悟,感谢大神指点!