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
ループ内のクライアントソケットを扱うために。
次に、クライアントで実行可能な、使用しています書き込みSocket
にconnect
サーバー(ポート上のサーバーを起動するために使用される)、およびサーバーへの交渉には。
接続の両端にあるソケットから取得する入出力ストリームを使用して通信を行うことができます。
これは宿題によく似ているので、実用的なコードは提供しませんが、次の手順に従うことができます。
Socket
を呼び出すconnect
を作成します。「hello world」を含む行など、クライアントからの最も単純なメッセージを送信するようにしてください。PrintWriter
たとえばOutputStream
、より便利なインターフェースでソケットをラップするために使用できます。ServerSocket
て呼び出しaccept
、返されたSocket
s を新しいThread
sに渡します。新しいs は、クライアントからの終了信号を受信するか、接続が閉じられる (IOException) まで、クライアントからの入力をループします。を で囲み、クライアントが送信したものを印刷することで、InputStream
1行ずつ読み取ることから始めることができBufferedReader
ます。OutputStream
クライアントに関連付けられたソケットの応答を書き込み、クライアントはそのソケットを読み取りInputStream
ます)。完了したら、最初にサーバーを起動し、サーバーに対して必要な数のクライアントを実行します。connect
呼び出しによって内部的に接続が開かれるため、サーバーを最初に起動する必要があります。これは、サーバーがクライアントの接続先のポートでリッスンしている場合にのみ接続を完了することができるためです。スレッド化がまったく複雑な場合は、接続を受け入れ、そこから行を読み取り、スレッド化されたロジックを追加する前にそれを閉じるサーバーを作成してみてください。あなたのコードからは、クライアント/サーバー接続の仕組みを完全に理解していないように思えます。現時点では、クライアントを 1 つも持つことはできません。なぜなら、他のすべての問題は別として、あなたは もaccept
も も呼び出さないからconnect
です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加