Java スレッド: 複数のクライアントがサーバーに接続できるようにするプログラムの新しいスレッドを作成するために、コード内の適切な場所を見つける方法

user5988582

2 つのプログラム ファイルを作成しています (1 つのクライアント、1 つのサーバー)。クライアント コードは、サーバーに接続する複数のクライアントを作成できる必要があります (サーバーは 1 つだけです。複数または無限の数のクライアントが存在する可能性があります)。サーバーに接続するクライアントごとに 1 つの新しいスレッドを作成する必要があります。クライアントを作成する方法は、新しいコマンド プロンプト/mac ターミナル ウィンドウを開き、クライアント ファイルを実行することです。クライアントが接続されると、サーバーにメッセージを送信できます。また、接続されている他のクライアントから送信されたすべてのメッセージをサーバーから受信します。

ここでは、クライアント コードに焦点を当てます。(サーバーコードはまだありません)

次のコードでは、新しいスレッドを作成した場所が 2 箇所ありますが、Eclipse でプログラムを実行したときにエラーが発生しないため、どの場所に配置すればよいかわかりません。

import java.io.*;
import java.net.*;
import java.util.*;
import static java.nio.charset.StandardCharsets.*;
public class ChatClient
{
    private static Socket Socket;
    static int numberOfClients = 0;
    public static void main(String args[]) 
    {


          //If I wanted to create multiple clients, would this code go here? OR should the new thread creation be outside the while(true) loop?
          while (true)
          {
              try 
              {
                  String host = "localhost";
                  InetAddress address = InetAddress.getByName(host);
                  numberOfClients += 1;
                  Thread ChatClient1 = new Thread ()
                  {
                      public void run()
                      {   
                          ServerSocket serverSocket = null;
                          Socket socket = null;
                          try 
                          {
                              int numberofmessages = 0;
                              String[] messagessentbyotherclients = null;
                              System.out.println("Try block begins..");
                              System.out.println("Chat client is running");
                              String port_number1= args[0];
                              System.out.println("Port number is: " + port_number1);
                              int port = Integer.valueOf(port_number1);
                              System.out.println("Listening for connections..");
                              System.out.println( "Listening on port: " + port_number1 );
                              serverSocket = new ServerSocket(port);
                              for(int i = 0; i < numberOfClients; i++)
                              {
                                  System.out.println(messagessentbyotherclients);
                              }
                          }
                          catch (IOException e)
                          {
                              e.printStackTrace();
                          }
                      }
                  };
                  ChatClient1.start();
        }
        catch (IOException e)
        {
            System.out.println("I/O error: " + e);
        }
    }
}

私の質問は次のとおりです。メイン関数のすぐ下にスレッドを作成するか、while(true) ループ内にスレッドを作成する必要がありますか? (while true ループは、標準入力のコントロール D によって最終的に終了します)

ミドール

あなたのコードは実用的な解決策には程遠いので、現時点ではコメントしても役に立たないと思います。コメントの人々がすでに説明したように、クライアントとサーバー用に2つの実行可能ファイルが必要です。現時点で行うことは、同じサーバーに接続する複数のクライアントを作成する機会を与えずに、内部ループでサーバー スレッドを生成することです。

クライアントごとに1つのスレッドを使用してマルチスレッドクライアント/サーバーアプリケーションを書くための通常の方法では、サーバーで実行可能な、開いた記述することですServerSocketしている、accept新しいのとスポーンThreadループ内のクライアントソケットを扱うために。

次に、クライアントで実行可能な、使用しています書き込みSocketconnectサーバー(ポート上のサーバーを起動するために使用される)、およびサーバーへの交渉には。

接続の両端にあるソケットから取得する入出力ストリームを使用して通信を行うことができます。

これは宿題によく似ているので、実用的なコードは提供しませんが、次の手順に従うことができます。

  • それぞれに main メソッドを持つ 2 つのクラスを作成します。
  • 1 つのクラスで、サーバーSocketを呼び出すconnect作成します。「hello world」を含む行など、クライアントからの最も単純なメッセージを送信するようにしてください。PrintWriterたとえばOutputStream、より便利なインターフェースでソケットをラップするために使用できます。
  • もう一方のクラスでは、ループ内で を作成しServerSocketて呼び出しaccept、返されたSockets を新しいThreadsに渡します。新しいs は、クライアントからの終了信号を受信するか、接続が閉じられる (IOException) まで、クライアントからの入力をループします。を で囲み、クライアントが送信したものを印刷することで、InputStream1行ずつ読み取ることから始めることができBufferedReaderます。
  • 応答を送受信することにより、通信が双方向に機能することを確認します (サーバーはOutputStreamクライアントに関連付けられたソケットの応答を書き込み、クライアントはそのソケットを読み取りInputStreamます)。
  • 接続を介してアプリケーションのプロトコルを実装する

完了したら、最初にサーバーを起動し、サーバーに対して必要な数のクライアントを実行します。connect呼び出しによって内部的に接続が開かれるため、サーバーを最初に起動する必要があります。これは、サーバーがクライアントの接続先のポートでリッスンしている場合にのみ接続を完了することができるためです。スレッド化がまったく複雑な場合は、接続を受け入れ、そこから行を読み取り、スレッド化されたロジックを追加する前にそれを閉じるサーバーを作成してみてください。あなたのコードからは、クライアント/サーバー接続の仕組みを完全に理解していないように思えます。現時点では、クライアントを 1 つも持つことはできません。なぜなら、他のすべての問題は別として、あなたは もacceptも も呼び出さないからconnectです。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ