请教一个“Socket通信中的代码解决方案”.

请教Java通信 2013-10-09 02:29:50
高手,您好:
我在写一个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分
...全文
102 点赞 收藏 6
写回复
6 条回复
马达马达达 2013年10月09日
我自己跟了一下,发现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
回复 点赞
马达马达达 2013年10月09日
debug跟下Socket源码就很清楚了
回复 点赞
大师兄吖 2013年10月09日
引用 3 楼 u012375030 的回复:
灌水的混子哥,请问: 如果将“一个流”,这个“水龙头”关了,那么,“接在上面的水管”,这个Socket对象,从Java所支持的Socket通信的底层逻辑上,就:“一定会被收起来”吗...?
如果将水龙头关了,接在上面的水管不管的话,也是可以的,等待jvm来回收。关了是一个良好的习惯。
回复 点赞
请教Java通信 2013年10月09日
灌水的混子哥,请问: 如果将“一个流”,这个“水龙头”关了,那么,“接在上面的水管”,这个Socket对象,从Java所支持的Socket通信的底层逻辑上,就:“一定会被收起来”吗...?
回复 点赞
兔子托尼啊 2013年10月09日
晚上早点休息
回复 点赞
无聊找乐 2013年10月09日
把水龙头关了,接在上面的水管也要收起来
回复 点赞
发动态
发帖子
Java SE
创建于2007-09-28

3.4w+

社区成员

30.7w+

社区内容

Java 2 Standard Edition
社区公告
暂无公告