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

这样写有什么错嘛 ?ObjectOutputStream的多次new
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 出来还得又用上的时候,才不会报错?网上好多多是这样说的。。。。。请大伙们“评评理”呵呵
------最佳解决方案--------------------
没有问题。。
每个用户必须需要对应一个ObjectOutputStream,不然不能向它发消息啊。因为每个客户端用户的socket都不一样,对应的OutputStream和InputStream都不一样。没有必要复用一个ObjectOutputStream,而且也没有办法进行复用。像1L说的,有GC收集垃圾对象。

对于ObjectInputStream,如果服务器端Socket不需要读取客户端Socket发送的消息的话,就不需要。并不是说ObjectInputStream和ObjectOutputStream必须成对出现
------其他解决方案--------------------
多次new应该不会有问题的~~~
Java垃圾自动回收。。。。当然多次new 每一次循环之后,前面循环new的那个还在内存里面,但是引用已经指向了最新的这个,前面的就成了垃圾碎片了。。。。我认为不会出问题,是因为Java会自动垃圾回收。。不知对不对呢?
------其他解决方案--------------------
引用:
多次new应该不会有问题的~~~
Java垃圾自动回收。。。。当然多次new 每一次循环之后,前面循环new的那个还在内存里面,但是引用已经指向了最新的这个,前面的就成了垃圾碎片了。。。。我认为不会出问题,是因为Java会自动垃圾回收。。不知对不对呢?

好像是这个啊,不过,貌似还要考虑浏览器缓存
------其他解决方案--------------------
那你的那个流肯定是个静态变量或者全局变量,把他弄成局部的就可以了
------其他解决方案--------------------
话说,你的is 、os 都不关,很给力啊!
------其他解决方案--------------------
我也相关了啊,可是一关就出现异常:
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)

------其他解决方案--------------------
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)

}

------其他解决方案--------------------

public UserGroup(Socket s , String id , String name){//初始化用户的Socket,id,name
this.socket = s;
this.id = id ;
this.name = name ;
System.out.println("new 一个用户到用户组");