スレッドを使用してサーバーとクライアントを接続する簡単なチャット アプリケーションを作成しました。アクティブなすべてのクライアントにメッセージを送信したい。アクティブなスレッドのリストにメッセージを送信する方法は? メソッド 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);
}
}
}
}
}