我编的是一个有界面的client端和server端,用的是线程池来处理client的连接的~~现在的问题是,我想在多个client连接进来后,server端发消息给指定的client
小妹初学java,经验也不多,
我能想到的方法是通过指定client的ip和端口来指定特定的client下面代码是按下“发送”键之后的响应事件:Java code
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        //按下“发送”键   , 首先需要在服务器端 显示信息,再发送到客户端
        
        DataOutputStream dos=null;
        Socket clientsocket=null;
        for(int i = 0;i < clientvector.size();i++){
            if((jTextField2.getText().equals(clientvector.elementAt(i).getInetAddress()))&&(Integer.parseInt(jTextField3.getText())==(clientvector.elementAt(i).getPort())))
            {
                clientsocket=clientvector.elementAt(i);
            }        
        }
        if(clientsocket==null){
            System.out.println("无法找到您想要连接的客户端。");
        }
        try {
            dos = new DataOutputStream(clientsocket.getOutputStream());
            
        } catch (IOException e1) {
            
            e1.printStackTrace();
            
        }
        jTextArea2.append("服务器端说:"+jTextField1.getText()+"\n");//在server显示要发送到client的信息
        
        try {
            dos.writeUTF("服务器端说:"+jTextField1.getText()+"\n");
            
        } catch (IOException e) {
            
            e.printStackTrace();
            
        }
        try {
            jTextArea2.append("dos关闭\n");
            dos.close();
        } catch (IOException e) {
            
            e.printStackTrace();
        }
        
        
        jTextField1.setText("");
    }我现在的问题是我每按一次"发送", client端socket就关闭,serversocket也关闭了我该不该为每一次"发送"事件都创建一个dataoutputstream呢??  实在是不知道怎么办了,希望大家帮帮忙啊!

解决方案 »

  1.   

    应该是每有一个Client连接就在Server端单独为其创建一个线程
    然后在这个线程和Client里都有一个while循环,这样才能一直监听,而不会关闭
      

  2.   

    楼上说的我都有了。我的意思是,当我按下server端的"发送"按钮后 应该触发什么样的事件???
      

  3.   

    首先server端对client端连接的监听跟二楼说法一样,
    那么在客户端建立连接的时候就往server端发送一些
    具有标识性字符串,这些字符串标识这每个client端的编号和它的输出流标号,并将他们一起放到一个map里面,这样每个client都对应自己的输出流,如此你在server端点击发送是只需遍历这个map就能拿到所有的client和起对应的输出流,并向每个输出流写相同的字符,那么每个client端都能收到server的消息了,这样做还有个好处就是,事实上client端的IP随时都可能在变化,而监听client端的IP会很麻烦,并且你上面做的一个IP对应一个端口,当client连接的数量很多时,server不得不开很多的端口,这样server端的负荷很大,我以上说的办法只是在一个端口监听client的连接而无需关心IP,当有一个client连接的请求到达时server就为其开一个线程为其服务,;
    你所说的 当我按下server端的"发送"按钮后 应该触发什么样的事件???
    如果按我的方法就只需遍历这个map集合,把client号作为key找到它的输出流向李曼写就可以了
      

  4.   

    建议至少用3个线程类实现,例如:服务器端:
    ServerThread 服务器连接监听类
    ServerClientThread 服务器端数据处理类客户端:
    ClientThread 客户端数据处理类在ServerThread中要统一管理ServerClientThread,点击按钮以后,由ServerThread遍历式调用ServerClientThread的消息发送函数