1

Java を使用してクライアント/サーバー チャット アプリケーションを開発しましたが、配列からユーザーを削除する方法を知りたいです。特定のクライアントがログインすると、ユーザー名がユーザー名配列に保存され、クライアント ID がクライアント配列に保存されます。サーバーが複数のクライアントを受け入れられるようにするために、スレッドを使用しています。これで、アレイからユーザーを削除し、そのユーザーの接続を閉じる方法について誰でも案内できます。

新しいクライアントを追加し、ID をクライアント配列に保存する

public class AddClient implements Runnable {

    Thread t;

    AddClient(String tot) {
        t = new Thread(this, tot);
        t.start();
    }

    public void run() {
        while (true) {
            try {
                try {
                    waitClient();
                } catch (Exception ex) {
                    ex.printStackTrace();

                }

                for (int i = 0; i < client.length; i++) {
                    if (client[i] == 0) {
                        client[i] = i + 1;
                        id = i;
                        break;
                    }
                }

                //set stream to send and receive data
                out[client[id]] = new ObjectOutputStream(connect.getOutputStream());
                out[client[id]].flush();
                in[client[id]] = new ObjectInputStream(connect.getInputStream());

ユーザー名はユーザー名配列に保存されます

username[client[id]] = cm.sender; //Add user in username[] array

ユーザーの削除

public synchronized void removeUser(int number) {
    int position = number;
    System.out.println("Server removing user " + username[number] + "which is client " + number);

    for (int i = 0; i <= client.length; i++) {
        if (position == client[i]) {
            System.out.println("User to be remove found");
            try {
                client[i + 1] = client[i];
                in[position].close();
                out[position].close();
                username[position] = null;
                position = position - 1;

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

HashTable を使用してクライアントを追加および削除しようとしています

public class ChatServerProtocol {
private String nick;
private AddClient a;

private Hashtable<String, AddClient> nicks = new Hashtable<String, AddClient>();


private boolean add_nick(String nick, AddClient a) {
    if (nicks.containsKey(nick)) {
        return false;
    } else {
        nicks.put(nick, a);
        return true;
    }
}

private boolean remove_nick(String nick, AddClient a) {
    if (!(nicks.containsKey(nick))) {
        return false;
    } else {
        nicks.remove(nick);
        return true;
    }
}

public ChatServerProtocol(AddClient a) throws IOException {
    nick = null;
    a = a;
}

しかし、どうすれば add_nick メソッドを呼び出すことができるでしょうか。クライアントがログインするたびに、ユーザー名がサーバーに送信され、サーバーはそれを cm.sender として読み取ります。スレッド変数も含める必要があります。後でユーザー名を削除できるようにユーザー名を追加する方法。

  ChatServerProtocol.add_nick(cm.sender);
4

1 に答える 1

0

いいえ、データベースに保存するのは得策ではありません。詳細を保存するのはセッションの間のみであり、データベースの基本的な概念はセッション後に使用することです。ネットワークの問題などでセッションが中断された場合はどうなりますか?

キーをクライアント ID として、値をユーザー名として使用して、単純な配列の代わりに Map を使用するだけです。ユーザー名の削除は、map.remove(clientID); のような単純な呼び出しになります。

あなたが尋ねたように編集:このコードは完全ではなく、あなたが与えたものだけであることに注意してください..

public class AddClient は Runnable { Thread t; を実装します。

private Map<int, String> users = new HashMap <int, String>();

AddClient(String tot) {
    t = new Thread(this, tot);
    t.start();
}

public void run() {
    while (true) {
        try {
            try {
                waitClient();
            } catch (Exception ex) {
                ex.printStackTrace();

            }

            int clientId = users.size() + 1;
            users.put(clientId, cm.sender);


            //set stream to send and receive data
            out[clientId] = new ObjectOutputStream(connect.getOutputStream());
            out[clientId].flush();
            in[clientId] = new ObjectInputStream(connect.getInputStream());

ユーザーメソッドを削除

パブリック同期ボイド removeUser(int 番号) {

            if(users.containsKey(number)) {
               System.out.println("Server removing user " + users.get(number) + "which is client " + number);
               users.remove(number);
            } else {
               System.out.println("User not in session");
            }
}
于 2013-04-08T11:14:23.670 に答える