这样写有什么错嘛 ?ObjectOutputStream的多次new

Ronys 2011-05-22 12:19:23
m.setMessageType(ONLINE_PACKET);// 通知在线用户有新用户上线了;
for (int i = 0; i < v.size(); ++i) {
System.out.println("在线用户包");
ObjectOutputStream oos = new ObjectOutputStream(v.get(i).s.getOutputStream());
//ObjectInputStream ois =new ObjectInputStream(v.get(i).s.getInputStream());
oos.writeObject(m);
oos.flush();
}
这段代码大概意思是:我发送一个消息包messagePacket,告诉每一个在线用户(存在Vector)中,某人上线了,因为要发送给每一个用户,所以用了循环,可是不知道多次new ObjectOutputStream会不会有什么问题,请赐教!还有我用了ObjectOutputStream 是不是一定要用ObjectInputStream ,且一一对应啊,并且还要有用,就是new 出来还得又用上的时候,才不会报错?网上好多多是这样说的。。。。。请大伙们“评评理”呵呵
...全文
226 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
亓根火柴 2012-11-26
  • 打赏
  • 举报
回复

public UserGroup(Socket s , String id , String name){//初始化用户的Socket,id,name
		this.socket = s;
		this.id = id ;
		this.name = name ;
		System.out.println("new 一个用户到用户组");
		try {//6 行  为什么会等在这里呢 
			this.ois = new ObjectInputStream(s.getInputStream());
			this.oos = new ObjectOutputStream(s.getOutputStream());
		} catch (IOException e) {
			e.printStackTrace();
		}
		System.out.println("new 一个用户,并初始化成功");
	}
一有用户上线就创建一个用户对象,并放到用户组里,可是为什么会等在第六行呢?
nyq1999 2011-05-23
  • 打赏
  • 举报
回复
那你的那个流肯定是个静态变量或者全局变量,把他弄成局部的就可以了
gentleboy2009 2011-05-22
  • 打赏
  • 举报
回复
多次new应该不会有问题的~~~
Java垃圾自动回收。。。。当然多次new 每一次循环之后,前面循环new的那个还在内存里面,但是引用已经指向了最新的这个,前面的就成了垃圾碎片了。。。。我认为不会出问题,是因为Java会自动垃圾回收。。不知对不对呢?
Ronys 2011-05-22
  • 打赏
  • 举报
回复
for (int i = 0; i < v.size(); ++i) {
System.out.println("在线用户包");
ObjectOutputStream oos = new ObjectOutputStream(v.get(i).s.getOutputStream());
ObjectInputStream ois =new ObjectInputStream(v.get(i).s.getInputStream());
oos.writeObject(m);
oos.flush();
}这样写的话,第一个人上线可以正常向大伙发送在线包,但是第二个人一上线就报错了了:java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1356)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at com.manager.userFrame.readyFrame.run(readyFrame.java:51)
at java.lang.Thread.run(Thread.java:619)

}
Ronys 2011-05-22
  • 打赏
  • 举报
回复
我也相关了啊,可是一关就出现异常:
java.io.EOFException
at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
at com.manager.userFrame.readyFrame.run(readyFrame.java:51)
at java.lang.Thread.run(Thread.java:619)
chosen0ne 2011-05-22
  • 打赏
  • 举报
回复
没有问题。。
每个用户必须需要对应一个ObjectOutputStream,不然不能向它发消息啊。因为每个客户端用户的socket都不一样,对应的OutputStream和InputStream都不一样。没有必要复用一个ObjectOutputStream,而且也没有办法进行复用。像1L说的,有GC收集垃圾对象。

对于ObjectInputStream,如果服务器端Socket不需要读取客户端Socket发送的消息的话,就不需要。并不是说ObjectInputStream和ObjectOutputStream必须成对出现
安心逍遥 2011-05-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 gentleboy2009 的回复:]
多次new应该不会有问题的~~~
Java垃圾自动回收。。。。当然多次new 每一次循环之后,前面循环new的那个还在内存里面,但是引用已经指向了最新的这个,前面的就成了垃圾碎片了。。。。我认为不会出问题,是因为Java会自动垃圾回收。。不知对不对呢?
[/Quote]
好像是这个啊,不过,貌似还要考虑浏览器缓存
shaosijun2004 2011-05-22
  • 打赏
  • 举报
回复
话说,你的is 、os 都不关,很给力啊!

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧