0

ネットワーク内の他の人がそれを読めるように、PDF 形式のインテークを共有フォルダーに送信する Java インテーク プログラムを作成しました。ただし、誰かに言われない限り、他の人がインテークが送信されたことを知る方法がないため、プログラムから他のコンピューターにインテークが送信されたことを知らせる警告メッセージを送信する必要があります。

今、私はこれについていくつかの調査を行い、TCP は信頼できるので、進むべき道であると考えました。また、これは 1 対多の送信が行われていることもわかっているので、Intake プログラムがサーバーとして機能し、他のコンピューターがクライアントとして機能すると仮定しますか、それとも逆にする必要がありますか?

ここで、サーバーをリッスンし、サーバーがメッセージを送信するのを待つクライアント プログラムを作成する必要があると仮定します。

それを念頭に置いて、どうすればいいですか:

  • プログラムが閉じられるまで継続的にメッセージをリッスンするクライアント プログラムを作成します。「while (true)」とスリープを使用することを前提としています。もしそうなら、どのくらいの時間プログラムをスリープ状態にしますか?
  • Windows の起動時にロードできるように、Windows サービスの一部として作成します。

サーバー側では、次のことを行うにはどうすればよいですか。

  • TCP はマルチキャストやブロードキャストができないため、複数のコンピューターにメッセージを送信します。ここで配列/ベクトルが役割を果たすと思います。

ああ、これは一方通行のコミュニケーションです。クライアントはサーバーに応答する必要はありません。

4

1 に答える 1

1

まず第一に、UDPは非常に信頼性があります(実際、IPプロトコル自体と同じくらい信頼性があります)。TCPは、バックエンドで非常に多くの魔法を伴うデータが受信されたことを確認するだけです。他のマシンがメッセージを受信したことを絶対に確認する必要がない限り、UDPを使用してそれを行うことができます。「TCPを使用しないでください」と言っているのではないことに注意してください。UDPも考慮に入れる必要があることを明確にしたいと思います。

とにかく、はい、あなたは簡単なリスニングプログラムを作成することができます。これは、サーバーからメッセージを読み取るJavaのクライアントの例です。Threadクラスのrunメソッドをオーバーライドします。

public void run() {
    try {
        String messageFromServer = reader.readLine();
        while (messageFromServer != null) {
            // Do things with messageFromServer here                               
            // processor.processFromServer(messageFromServer);
        messageFromServer = reader.readLine(); // Blocks the loop, waits for message
        }
    }
    catch (IOException e) {
            // Handle your exception
    }
}

とりわけ、私のスレッドは次のように設定されました。

public CommunicationThread(String hostname, int port, int timeout) throws IOException, SocketTimeoutException {
    InetSocketAddress address = new InetSocketAddress(hostname, port);   
    socket = new Socket();
    socket.connect(address, 2000); // 2000ms time out
    // You can use the writer to write messages back out to the server
    writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));         
    reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}

ここで、サーバー側に関して、次のように実行できます。

  1. クライアントがあなたの住所を知っている場合に、クライアントが連絡できるようにするプログラムを作成します。
  2. 接続を受け入れ、ソケットをリストに保存します。
  3. メッセージを送信する必要がある場合は、リストをトラバースして、リストの全員にデータを送信します。

あなたはあなたのサーバーで聞き始めることができます

this.socket = new ServerSocket(port);

他の人にサービスを提供しながらクライアントを受け入れることができるように、スレッド化することもできます(またはすべきです(?))。次の方法で新しいクライアントを受け入れることができます。

socket.accept(); // Blocks, waiting for someone to connect, returns open socket

これを、BufferedWriter(および、クライアントからも読み取りたい場合はBufferedReader)を処理できるまったく新しいクラスに自由に渡してください。そのクラスは、writeToClient(message)などを実装する場所です。writeToClient(String s)メソッドと(サーバーサーバー、ソケットソケット)を持ち、ArrayListconListを初期化したClientConnectionクラスがある状況を考えてみます。従う方法は次のとおりです。サーバーの別のスレッドで、

ClientConnection con = new ClientConnection(this, socket.accept());
conList.add(con);

次に、クライアントに書き込みたい場合:

for (ClientConnection c : conList) {
    c.writeToClient("I'm sending you a message!");
}

私はあなたがあなたが何をする必要があるかについて漠然とした考えを得ることを望みます。Socketのドキュメントを読んでください。とても便利です。また、スレッド化されたアプリケーションの場合と同様に、リストをトラバースしているときにリストを変更するなどのことを行わないようにし、競合状態を回避してください。

幸運を!

于 2012-06-20T21:34:20.877 に答える