我们的作业是写一个聊天程序,因为涉及多线程,所以我选择Vector来保存Tcp服务器端和客户端建立的连接对象Connections
因为Vector是线程同步的,我看了网上一些代码,对这个Vector存储自定义对象有些疑问,请大师解答^_^
- Java code
//比如Vector存储的是Connections类别static Vector<Connection> connVector=new Vector<Connection>(10)//存储建立连接的Connection......//关于Connection类的实现就省略了,为了简单变量的定义也省略,只说主要问题 socket = server.accept();//make a connection with client System.out.println(socket.getInetAddress().toString()+"joined the server\n"); Connection connect=new Connection(socket); connVector.add(connect);//把建立的链接存入connVector
OK,现在我的问题是,在client的一个实例加入Vector的时候,并没有什么唯一的关键字,在遍历Vector去移除一个对象的时候,它怎么知道要移除谁呢?比如
- Java code
while(connVector.size()>0){ Connection connect=(Connection)connVector.firstElement();//取出Vector中第一个服务器客户机的Tcp链接 try{ connect.socket.close();//socket 是Connection中定义的方法 }catch(IOException ex){ ex.printStackTrace(); } connVector.removeElement(connect);//ok我的问题主要在这一步 }
在connect被存入这个Vector的时候,所有的connect貌似都没有名字,而且我在自己机器上测试的,所以connect在我个人认为都长的一样的,这个Vector在remove的时候,如何辨认就是remove的这个connect呢?
Vector是可以有重复对象的,有没有这种可能,我这个机器上又运行Tcp服务器端又运行三个客户端,结果三个客户端Ip,socket什么的都一样,也就是Vector内容都一样,一个removeElement(connect)就把三个客户端都关闭了?
------解决方案--------------------
removeElement(Object)使用的equals方法比较的两个对象,会遍历移除第一个匹配equals的
- Java code
public synchronized int indexOf(Object o, int index) { if (o == null) { for (int i = index ; i < elementCount ; i++) if (elementData[i]==null) return i; } else { for (int i = index ; i < elementCount ; i++) if (o.equals(elementData[i])) return i; } return -1; }