Javaで基本的なクライアントサーバープログラムを作成しました。それはこのようにアウトを開始:Javaソケット:1つのサーバーと複数のクライアント
- クライアントは
- Serverは名前
- Serverは、この後にクライアント
- に挨拶して、クライアントの名前
- クライアントが応答するために、クライアントが話し、サーバーが繰り返される尋ねるServerに接続します言葉戻る
this tutorialを使用するとあまり問題なく動作するようになりました。この問題は、複数のクライアントを導入しようとするたびに発生します。私は、複数のスレッドを使用しているので動作すると思っていましたが、2番目のクライアントは、最初のクライアントが終了してから動作するまでハングします(サーバは2番目のクライアントからの入力を受け付けますが、最初のクライアントが終了するまで)。
import java.net.*;
import java.io.*;
public class Server extends Thread {
private ServerSocket listener;
public Server(int port) throws IOException {
listener = new ServerSocket(port);
}
public void run() {
while(true) {
try {
Socket server = listener.accept();
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("What is your name?");
DataInputStream in = new DataInputStream(server.getInputStream());
String user_name = in.readUTF();
out.writeUTF("Hello "+user_name);
while(true) {
String client_message = in.readUTF();
out.writeUTF(client_message);
}
}
catch(IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int port = 6006;
try {
Thread t = new Server(port);
t.start();
} catch(IOException e) {
e.printStackTrace();
}
}
}
を誰かが私が間違ってやっているかを説明することはできます:ここで
は、私が使用しているコードのですか?
私は拡張スレッドの代わりにRunnableを見ましたが、さらに問題が発生しましたので、まずこれを試してみたいと思います。
ここにはマルチスレッドはありません。 – Cruncher
listener.accept()の後のすべては、スレッドを拡張するか、または実行可能メソッドを実装する別のクラスにある必要があります。その時点でそのスレッドを開始すると、ループは次の接続を受け入れます。 – Cruncher