0

スレッドを使用してサーバーとクライアントを接続する簡単なチャット アプリケーションを作成しました。アクティブなすべてのクライアントにメッセージを送信したい。アクティブなスレッドのリストにメッセージを送信する方法は? メソッド flush () を使用しましたが、すべてのアクティブなクライアントにメッセージを送信できませんでした。次のように、Google でスレッド リストを表示するメソッドを見つけました。

public static void listThreads(ThreadGroup group, String indent) {
    System.out.println(indent + "Group[" + group.getName() + 
                    ":" + group.getClass()+"]");
    int nt = group.activeCount();
    Thread[] threads = new Thread[nt*2 + 10]; //nt is not accurate
    nt = group.enumerate(threads, false);

    // List every thread in the group
    for (int i=0; i<nt; i++) {
        Thread t = threads[i];
        System.out.println(indent + "  Thread[" + t.getName() 
                    + ":" + t.getClass() + "]");
    }

    // Recursively list all subgroups
    int ng = group.activeGroupCount();
    ThreadGroup[] groups = new ThreadGroup[ng*2 + 10];
    ng = group.enumerate(groups, false);

    for (int i=0; i<ng; i++) {
        listThreads(groups[i], indent + "  ");

}
}
}

メッセージを送信するメソッド:

class ChatThread extends Thread{
    static Vector<ChatThread> chatthread = new Vector<ChatThread>(2);
    private String rslt;
    private BufferedReader in;
    private PrintWriter out;
    private Socket sock;


    public ChatThread (Socket socket) throws IOException {
        this.sock = socket;
        in  = new BufferedReader(
              new InputStreamReader(socket.getInputStream()));
        out = new PrintWriter(
              new OutputStreamWriter(socket.getOutputStream())); }

    public void run(){


        String line;
        synchronized(chatthread) {
        chatthread.addElement(this); }
        String portnum = Integer.toString(sock.getPort());

        try {

        line = in.readLine()+portnum;
        String[] mssgin = line.split("\\.");

        for(int i = 0; i < chatthread.size(); i++) {

                ChatThread handler =
                (ChatThread)chatthread.elementAt(i);
                handler.out.println(line + "\r");

                if(teksmasuk[0].contentEquals("login")){
                    MysqlConn ceklogin = new MysqlConn();
                    rslt = ceklogin.login(line); 
                    System.out.println(rslt);
                    handler.out.flush();


                }else if(mssgin[0].contentEquals("reg")){
                    Registrasi regis = new Registrasi();
                    rslt = regis.register(line);
                    System.out.println(rslt);
        handler.out.flush();
                }
                else {          
                System.out.println("Waiting...");
                }               

        }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
        } 
        finally {
            try {
                in.close();
                out.close();
                sock.close();
                } catch(IOException ioe) {
                } finally {
                synchronized(chatthread) {
                chatthread.removeElement(this);
                }
                }
        }

    }

}
4

1 に答える 1

0

これには、いくつかの一般的な設計上の問題があります。特定のスレッドにメッセージを送信しようとしてはなりません。特定のクライアントにメッセージを送信しようとしているはずです。スレッドを互いに完全に分離するようにしてください。彼らの唯一の相互作用は、お互いに設定したストリームを介する必要があります。

于 2012-05-11T04:44:29.157 に答える