本帖最后由 iamczb 于 2014-12-01 21:14:25 编辑

解决方案 »

  1.   

    close不会输出什么,你从应用层调用close,最终反应到协议层的动作是:
    1. 刷新缓冲区里的数据,将缓冲区里没有发送完的数据发送出去(没有特殊配置)
    2. 向对方发送fin,这个动作对于应用层不可见
      

  2.   

    如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢(因为 if 块里的打印语句被执行了),小白我还是不太明白什么是协议层,什么是应用层,可以解释得通俗一点吗?
    主要问题是服务端的下面两句:
    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是不会让小白失望的吧~~
      

  3.   

    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);
        }
      

  4.   

    如果改成
    String s;
    System.out.println(s);   //则屏幕上不会输出null,而会抛出空指针异常答: 不可能。变量s都没有正确初始化,编译都通不过的!问:如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢
    答:当对方调用close()时,传输层会发送FIN TCP报文,你的机器对应的传输层会收到这个FIN的TCP报文,处理后,你的应用层(即你的程序)再读取数据时,会发现对方已结束数据发送,再无数据可读了(即:已读到流的结束),因而JAVA程序代码 input.readLine() 将返回 null。
      

  5.   

    如果改成
    String s;
    System.out.println(s);   //则屏幕上不会输出null,而会抛出空指针异常答: 不可能。变量s都没有正确初始化,编译都通不过的!问:如果close不会返回什么的话,为什么还能用if(str == null)来判断,而且判断结果为true呢
    答:当对方调用close()时,传输层会发送FIN TCP报文,你的机器对应的传输层会收到这个FIN的TCP报文,处理后,你的应用层(即你的程序)再读取数据时,会发现对方已结束数据发送,再无数据可读了(即:已读到流的结束),因而JAVA程序代码 input.readLine() 将返回 null。
    -------------------------------------------------------------------------------------------------------------------------------------------------------
    终于明白问题所在了,原来是我把null对象和没有初始化的对象两个定义搞混了,看了您对print方法的解释才醒悟,感谢大神指点!