Javaで単純なクライアント/サーバーアプリケーションを実装しようとしています。Java while(true)ループはスレッド内で一度だけ実行されます
ここではコードです:
Client.java
public class Client implements Runnable {
private String hostName;
private int portNumber;
private String message;
private Socket socket;
private PrintWriter writer;
private BufferedReader reader;
public Client(String hostName, int portNumber, String message) {
this.hostName = hostName;
this.portNumber = portNumber;
this.message = message;
}
public void connect() {
try {
socket = new Socket(hostName, portNumber);
writer = new PrintWriter(socket.getOutputStream(), true);
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
writer.println(message);
} catch (UnknownHostException e) {
System.err.println("Could not resolve the host name '" + hostName + "'.");
} catch (IOException e) {
System.err.println("Could not get the I/O for the connection to '" + hostName + "'.");
}
}
private void listenForMessages() {
while (true) {
try {
System.out.println("In loop!");
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
}
public void run() {
connect();
listenForMessages();
}
}
Server.java
public class Server implements Runnable {
private int portNumber;
private String message;
private ServerSocket serverSocket;
private Socket clientSocket;
private PrintWriter writer;
private BufferedReader reader;
public Server(int portNumber, String message) {
this.portNumber = portNumber;
this.message = message;
}
private void listen() {
try {
serverSocket = new ServerSocket(portNumber);
} catch (IOException e) {
System.err.println(e.getMessage());
}
while (true) {
try {
clientSocket = serverSocket.accept();
writer = new PrintWriter(clientSocket.getOutputStream(), true);
reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
writer.println(message);
} catch (IOException e) {
System.err.println(e.getMessage());
break;
}
}
}
public void run() {
listen();
}
}
そして、これが主なクラスです:
public class Test {
public static void main(String[] args) {
Client client = new Client("localhost", 4444, "Hello from client!");
Server server = new Server(4444, "Hello from server!");
Thread serverThread = new Thread(server);
serverThread.start();
Thread clientThread = new Thread(client);
clientThread.start();
}
}
のロジックはコードは単純です:クライアントとSEの両方rverはwhile(true)
ループ内のメッセージを待っています。
listen
メソッド内のwhile
ループがうまく実行されます。しかし、listenForMessages
メソッドの内部では、ループは1回だけ実行されるようです。私は画面に印刷された "In Loop"を見るだけです。
問題の原因を特定できますか?
ありがとうございます!
は、デバッガを使用することはできますか? –
さて、私はプレーンテキストエディタを使用していますが、コマンドラインからデバッガを使用する方法がわかりません。 –
サイドノート:例外を見落とさないと確信していますか?あなたは、あなたのコードは単に**例外**の印刷**です。しかし、それは単にそれが何をしているのかを継続しようとします。例外については**失敗**を考慮してください! – GhostCat