情况是这样的,有一个服务器类,有个HashMap类型的属性,作为链接池。当一个链接过来的时候,就把该链接和输入输出流包装成一个对象,放入到HashMap里,当第二个链接过来的时候,又把该链接和输入输出流包装成一个对象放入到里面。但是后来的链接对象总是会覆盖掉前面的对象,不管链接多少个,最后连接池里,只有一个链接,也就是最后一个链接。不知道是什么原因,有高手解答下吗

解决方案 »

  1.   

    public class ServiceThread extends Thread {
     
    public Socket socket;
    private ObjectOutputStream objectout;
    private ObjectInputStream objectin;
    private Hashtable<String, Connection>map ;
    private Connection connectioninf;
    private Message message;
    // 重写构造函数
    public ServiceThread(Socket s ,Hashtable m) throws IOException, ClassNotFoundException {
    socket = s;
    System.out.println("连接上");
    System.out.println("线程池"+m);
    map = m;
    objectout = new ObjectOutputStream(socket.getOutputStream());
    objectin = new ObjectInputStream(socket.getInputStream());
    connectioninf = new Connection();
    connectioninf.setObjectin(objectin);

    connectioninf.setObjectout(objectout);

    connectioninf.setSocket(socket);
    String d = (String)objectin.readObject();
    System.out.println(d);

    map.put("d", connectioninf);
    System.out.println(map);
    System.out.println("放入连接池");
    System.out.println(map);
    start();
    } // 重写run方法 处理客户端的服务请求 public void run() {
    while(true){
    try {

    message = (Message)objectin.readObject();

    String p = message.getReceiver();
    System.out.println(p);
    Connection c =map.get(p);
    System.out.println(map);

    System.out.println(c);
        c.getObjectout().writeObject(message.getMesaage());

    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }



    } }}
      

  2.   

    该链接和输入输出流包装成一个对象这个map的key是什么?若是string,看看是代码,若是对象,看看其hashcode和equals方法是否正确其实多线程的话,或许用concurrenthashmap更合适
      

  3.   

      map 的key 是 客户端传过来的用户名,也就是String 
      

  4.   

    多线程 最好是 用Hashtable  ....
      

  5.   


    connectioninf.setSocket(socket);
    String d = (String)objectin.readObject();
    System.out.println(d);//map.put("d", connectioninf);
    map.put(d, connectioninf);
    楼主你再试试
      

  6.   

    哈哈,太不仔细了。我整了半天,还查了半天的资料,竟然是自己写错了。谢谢 fable0115