请教一个“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分
------解决方案--------------------把水龙头关了,接在上面的水管也要收起来
------解决方案--------------------晚上早点休息
------解决方案--------------------
如果将水龙头关了,接在上面的水管不管的话,也是可以的,等待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