0

LAN内のユーザーがチャットできるようにするJavaクライアント/サーバーチャットアプリケーションに取り組んでいます。

サーバー アプリケーションには、クライアントがサーバーに接続するたびに別のスレッドを作成するメイン クラスがあります。したがって、基本的には、個別のスレッドで実行されているすべてのクライアントとの TCP 接続を開いたままにします。

メッセージの送信に問題があります。ユーザーが新しいメッセージとその宛先をサーバーに送信すると、サーバーは宛先ユーザーと接続しているスレッドを見つけて、そのメッセージを宛先ユーザーに送信する必要があります。これを行うにはどうすればよいですか。すべてのスレッドをユーザー オブジェクトに関連付けたので、findThreadByUser(user) などを実行し、参照を取得した後、メッセージを送信するメソッドを呼び出すだけです。どうすればいいですか?

Runnable を実装する ConnectionHandler クラスの一部を次に示します。sendToClient(String message)クラスの特定のインスタンス、より具体的にはその最後のメソッド (実行メソッドの外側)にアクセスしたいと考えています。ユーザーとスレッドを格納するために HashMap を試しましたが、メソッドにアクセスできませんsendToClient(String message)

public class ConnectionHandler implements Runnable {

protected Socket socket;
private ServerData serverData;
private User currentUser;
BufferedReader inFromClient;
PrintStream outToClient;
String clientSentence;
String peerIp;
String peerHostName;

public ConnectionHandler(Socket socketToHandle, ServerData serverData) {
    socket = socketToHandle;
    this.serverData = serverData;
    inFromClient = null;
    outToClient = null;
    currentUser = null;

    clientSentence = " ";
}

@Override
public void run() {
peerIp = socket.getInetAddress().getHostAddress();
    peerHostName = socket.getInetAddress().getHostName();
    try {
        outToClient = new PrintStream(socket.getOutputStream(), true);

        /* Create a reading stream to the socket */

        inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (IOException ex) {
        Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
        System.out.println("Error creating buffered handles.");
    }

    System.out.println("Handling connection to client at " + peerIp + " --");

    Runnable r1 = new Runnable() {

        public void run() {
            while (true) {
                try {
                    /* Read client's message through the socket's input buffer */
                    clientSentence = inFromClient.readLine();
                } catch (IOException e) {
                    System.out.println(socket.getInetAddress() + "-" + peerIp + " broke the connection.");
                    break;
                }
                /* Output to screen the message received by the client */
                System.out.println("Message Received: " + clientSentence);

                List<String> processedClientSentence = ClientMessageProcessor.process(clientSentence);

                if (processedClientSentence.get(0).equals(new String("LOGIN"))) {
                    String result = ServerActions.login(peerIp, peerHostName, processedClientSentence.get(1), serverData);

                    if (result.equals("success")) {
                        currentUser = serverData.getUserByIP(peerIp);
                        outToClient.println("USERS \"" + ServerActions.getUsers(serverData) + "\"");
                    } else {
                        outToClient.println("ERROR \'" + result + "\'");
                    }
                } else if (processedClientSentence.get(0).equals(new String("GETUSERS"))) {
                    outToClient.println("USERS \"" + ServerActions.getUsers(serverData) + "\"");
                } else if (processedClientSentence.get(0).equals(new String("USERINFO"))) {
                } else if (processedClientSentence.get(0).equals(new String("MESSAGE"))) {
                    ServerActions.sendMessage(currentUser/*.getUserName()*/, processedClientSentence.get(1), processedClientSentence.get(2), serverData);
                } else if (processedClientSentence.get(0).equals(new String("LOGOUT"))) {
                } else {
                }

            }
        }
    };
    new Thread(r1).start();
}

public void sendToClient(String message) {
    outToClient.println(message);
}

}

4

3 に答える 3

2

Client オブジェクトを (一意になる) キーとして格納し、HashMapそれUserNameに関連付けられたスレッドを値として格納します...`

于 2012-06-17T17:31:53.300 に答える
1

ヘルプについては、これらの質問を参照してください..
1. Java でのマルチスレッド チャット サーバー
2. ソケットを使用したマルチスレッド クライアント
サーバー チャット

于 2012-06-17T17:31:31.117 に答える
-1

ブロードキャストを送信して、正しいクライアントにメッセージを受け入れさせてみませんか?

于 2012-06-17T17:44:34.230 に答える