-1

サーバーを作成/接続できるアプリの開発に成功しました。パブリック静的LinkedListがあるPersonという名前のクラスがあります。このリストには、サーバーに接続しているクライアントを格納しています。サーバー/クライアントクラスは同じパッケージに含まれています。サーバークラスとクライアントクラスはスレッドを拡張しています(バックグラウンドで動作しています)。

私がやろうとしていること。

  1. サーバーに接続しているすべてのクライアントにオンラインクライアントリスト(LinkedList)を送信したい。
  2. クライアントからデータ(StyledTextからの文字列)を読み取り、それをグローバルメインチャットエリア(StyledText)に書き込みたい。

(mIRCプログラムのようなもの)。

私は一日中読んで検索しましたが、「Javaチャットアプリ」についての良い説明、例、またはドキュメントを見たことがありません。私はAWT、Swingで見つけましたが、問題はSWTでしか知識がないことです。また、TELNETを使用したチュートリアルを見つけ、入力ストリームと出力ストリームをコンソール(CMD)で読み書きしました。InputStreamReader、BufferedStreamReader、PrintWriterを使用する必要がありますか?持っている場合、それらのデータをバイト配列に変換してからオブジェクトに変換する必要がありますか?

理解を深めるために、いくつかのスクリーンショットを投稿します。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

これが私がサーバーを作成する方法です:

DialogServer dialog = new DialogServer(new Shell());
dialog.create();
if(dialog.open() == Window.OK){
   new Server(serverAddress).start(); //dialog sets serverAddress as a String IP
}

サーバークラス:

public class Server extends Thread{

    private static ServerSocket serverSocket;
    private static Socket socket;
    private static String address;

    public Server(String address){
        this.address = address;
    }

    public void run(){
        try {
            serverSocket = new ServerSocket(5000, 10, InetAddress.getByName(address));
            View.serverUp = true;
            View.log("Server is up. Listening on " + address + ":5000");
            Person p = new Person(View.nickname, true, 100.0);
            Person.listPeople.add(p); //add ADMIN to static LinkedList
            while(true){
                socket = serverSocket.accept();
                new Client(socket).start(); // client class thread
                refresOnlineList(); // refresh UI table
            }

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public static void refresOnlineList(){
        View.display.syncExec(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                View.tableViewer.refresh();
                // TableViewer which contains online client list
            }
        });
    }
}

サーバーに接続するためのダイアログ:

   DialogConnect dialog = new DialogConnect(new Shell());
   dialog.create();
   if(dialog.open() == Window.OK){
      new Client(connectAddress, connectNickname).start(); // dialog sets String parameters. new Client start a new Thread for a client.
   }

クライアントクラス:

public class Client extends Thread{
    private static Socket socket;
    private static String nickname;

    public Client(Socket socket){
        this.socket = socket;
    }

    public Client(String address, String nickname){
        socket = new Socket();
        try {
            socket.connect(new InetSocketAddress(address, 5000), 10);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            View.log("Cannot connect to server.");
        }

        this.nickname = nickname;
    }

    public void run(){
        try {
            Person p = new Person(nickname, false, 15.4);
            Person.listPeople.add(p); // add PERSON to static LinkedList
            socket.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

EclipseRCP3.8で開発されました

4

1 に答える 1

1

あなたの目標は3つのタスクに分けることができます:

  1. ユーザーインターフェイスを作成するには
  2. ネットワーク通信を処理するには
  3. これら2つを結合するには

Stack Overflowは、AFAIKであり、プロジェクト全体をガイドすることを目的としたものではありません。あなたは特定の問題に関して特定の質問を述べる必要があります。

UIを作成する負担を取り除くために、コンソールアプリケーション(クライアントとサーバー)から始めることをお勧めします。それが終わったら、いくつかのUIを作成し、それにイベントをバインドできます。

于 2013-01-09T01:43:03.630 に答える