0

基本的に私がやりたいことは、チャット プログラム (インスタント メッセンジャーと IRC の間の何か) を開発して、Java のスキルを向上させることです。

しかし、これまでに 1 つの大きな問題に遭遇しました。複数のクライアントがある場合にストリームを適切にセットアップする方法がわかりません。クライアントとサーバー間の 1 対 1 のチャットは簡単に機能しますが、何をすべきかわからないため、複数のクライアントが同じチャットでサーバーと一緒にいることができます。

これは私が得たものですが、サーバーとの間の永続的なストリームの 1 つにすぎないため、非常に役立つとは思えません。

private void connect() throws IOException {
        showMessage("Trying to connect \n");
        connection = new Socket(InetAddress.getByName(serverIP),27499);
        showMessage("connected to "+connection.getInetAddress().getHostName());

    }

    private void streams() throws IOException{
        output = new ObjectOutputStream(connection.getOutputStream());
        output.flush();
        input = new ObjectInputStream(connection.getInputStream());
        showMessage("\n streams working");

    }
4

3 に答える 3

0

私はこれをとで数回行いましServerSocket(int port)Socket ServerSocket.accept()。これは、チャットサーバークライアントがリッスンする1つのポートをリッスンすることで非常に簡単になります。メインスレッドは、次のクライアントが接続するのを待ってブロックし、Socketオブジェクトをその特定のクライアントに返します。通常、それらをリストに入れて、n個のクライアントを一般的に処理する必要があります。

Socketそして、はい、おそらくそれぞれが異なるスレッドにあることを確認したいと思うでしょうが、それは完全にプログラマーとしてのあなた次第です。

クライアントが別の送信元ポートである一意の5タプル(SrcIP、SrcPort、DstIP、DstPort、TCP / UDP /その他のIPプロトコル)を使用しているため、サーバー上の別のポートにリダイレクトする必要がないことを忘れないでください。 1つのサーバーポートを再利用できるようになります。したがって、なぜ私たち全員がstackoverflow.comポート80を使用するのですか?

ハッピーコーディング。

于 2012-08-13T01:24:33.410 に答える
0

数ヶ月前にそのようなものを作りました。基本的に、私は個別ServerSocketThreadクライアントごとのサーバー側を使用しました。クライアントが接続すると、そのポートの入力ストリームと出力ストリームを固定プールに登録し、入力が送信されるまでブロックします。次に、入力を他の各クライアントにコピーして送信します。コマンド ラインから実行する基本的なプログラムを次に示します。 サーバー コード:

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;

    public class ChatServer {

        static int PORT_NUMBER = 2012;

        public static void main(String[] args) throws IOException {


            while (true) {
                try (ServerSocket ss = new ServerSocket(PORT_NUMBER)) {
                    System.out.println("Server waiting @" + ss.getInetAddress());
                    Socket s = ss.accept();
                    System.out.println("connection from:" + s.getInetAddress());

                    new Worker(s).start();
                }
            }

        }

        static class Worker extends Thread {

            final static  ArrayList<PrintStream> os = new ArrayList(10);
            Socket clientSocket;
            BufferedReader fromClient;

            public Worker(Socket clientSocket) throws IOException {
                this.clientSocket = clientSocket;
                PrintStream toClient=new PrintStream(new BufferedOutputStream(this.clientSocket.getOutputStream()));
                toClient.println("connected to server");
                os.add(toClient);
                fromClient = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

            }
            @Override
            public void run() {

                while (true) {
                    try {
                        String message = fromClient.readLine();
                        synchronized (os) {


                            for (PrintStream toClient : os) {
                                toClient.println(message);
                                toClient.flush();
                            }
                        }

                    } catch (IOException ex) {
                        //user discnnected
                        try {
                            clientSocket.close();
                        } catch (IOException ex1) {

                        }
                    }

                }
            }
        }

}

クライアントコード:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class Client {

    public static void main(String[] args) throws IOException {

        final BufferedReader fromUser = new BufferedReader(new InputStreamReader(System.in));
        PrintStream toUser = System.out;
        BufferedReader fromServer;
        final PrintStream toServer;
        Socket s = null;

        System.out.println("Server IP Address?");


        String host;
        String port = "";


        host = fromUser.readLine();

        System.out.println("Server Port Number?");

        port = fromUser.readLine();

        s = new Socket(host, Integer.valueOf(port));

        int read;
        char[] buffer = new char[1024];


        fromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
        toServer = new PrintStream(s.getOutputStream());
        new Thread() {

            @Override
            public void run() {
                while (true) {
                    try {
                        toServer.println(">>>" + fromUser.readLine());

                        toServer.flush();
                    } catch (IOException ex) {
                        System.err.println(ex);
                    }
                }
            }
        }.start();
        while (true) {
            while ((read = fromServer.read(buffer)) != -1) {
                toUser.print(String.valueOf(buffer, 0, read));
            }
            toUser.flush();

        }
    }
}
于 2012-08-13T00:24:38.897 に答える
0

1 つのプログラムで複数のストリームから読み取るには、マルチスレッドを使用する必要があります。ストリームからの読み取りは同期的であるため、スレッドごとに 1 つのストリームから読み取る必要があります。マルチスレッドの詳細については、スレッドに関するJava チュートリアルを参照してください。

于 2012-08-13T00:18:48.677 に答える