日期:2014-05-20  浏览次数:20734 次

请教一个“Socket通信中的代码解决方案”.
高手,您好:
    我在写一个Socket Java im系统.
    请教一个问题:
    在进行Java的类库所支持的“Socket通信”的代码书写上,为什么会有:
    所创建的Socket对象,如果在进行了“流的读取”这一步操作后,例如:
    Socket so = new Socket(IPAddress,9999);
    DataOutputStream dops = new DataOutputStream(so.getOutputStream());
    会有:
    在需要传递上述的Socket的对象“so”进入构造方法的参数列表中的时候,出现:
    如果在这一行构造方法的语句之上,有一句:
    dops.close();
    语句的话..
    会造成:
    传入的Socket对象,失去可用性。
    写出的代码里会有:
    Socket closed.
    的错误提示?
    按照道理来说,Socket,只是一个水管.
    为什么关闭了流DataOutputStream的对象dops之后,在Socket类的对象同样存在close方法的场景下,会有:
    “关闭了流”,“未动Socket对象的close方法”的代码书写的背景下,会有:
    流被关闭,Socket对象也被关闭.的代码运行环境的作用效果...?
    如果从这一点上来说的话..
    Socket对象是早晚要关闭的.
    流在进行了Socket的关闭之后,肯定是要关闭的.
    如果一旦进行了流的关闭之后,为什么还要进行:“再关一遍Socket对象”的代码书写方案的进行...?
    关闭了流,不是就会显示出流所连接的Socket对象水管的“closed”的提示了吗...?
    为什么还要“再进行一遍将已经关闭的Socket对象进行关闭”的操作呢...?
    希望得到高手尽快的点拨!!
    一百分奉上!!
                                                           一位日日夜夜向着理想奔跑的筑梦者
                                                           2013年10月9日星期三早晨2点27分
通信 socket IO流 Java?SE

------解决方案--------------------
把水龙头关了,接在上面的水管也要收起来
------解决方案--------------------
晚上早点休息
------解决方案--------------------
引用:
灌水的混子哥,请问:
    如果将“一个流”,这个“水龙头”关了,那么,“接在上面的水管”,这个Socket对象,从Java所支持的Socket通信的底层逻辑上,就:“一定会被收起来”吗...?

如果将水龙头关了,接在上面的水管不管的话,也是可以的,等待jvm来回收。关了是一个良好的习惯。
------解决方案--------------------
我自己跟了一下,发现DataOutputStream dops.close();会走到SocketOutputStream里的close()如下
  public void close() throws IOException {
// Prevent recursion. See BugId 4484411
if (closing)
    return;
closing = true;
if (socket != null) {
    if (!socket.isClosed())
socket.close();//这里关闭了Socket
} else
    impl.close();//这里关闭了SocketImpl
closing = false;
    }

也就是说,你执行dops.close()的同时也把Socket so关闭了。
但是还是建议养成关闭的习惯,小心驶得万年船啊!!
PS:debug中会经过StreamEncoder,StreamEncoder代码如下
http://www.docjar.com/html/api/sun/nio/cs/StreamEncoder.java.html