Javaサーバークライアント|サーバーは2番目の要求を受信しません
-
08-07-2019 - |
質問
割り当てのためにクライアントとタイムサーバーを作成しようとしていますが、サーバーがクライアントから2番目のリクエストを受信するのに問題があります。最初のリクエストは問題なく通過します。その後、ただ失速します。私は実際、このすべてにかなり迷っており、Javaにはまだ不愉快なので、何が欠けているのか分かりません。ポインタは大歓迎です。ありがとう!
サーバーコードは次のとおりです。
import java.io.*;
import java.util.*;
import java.net.*;
import java.text.*;
public class myServer {
protected static final int PORT_NUMBER = 55555;
public static void main( String args[]) {
try {
ServerSocket servsock = new ServerSocket(PORT_NUMBER);
System.out.println("Server running...");
while(true) {
Socket sock = servsock.accept();
System.out.println("Connection from: " + sock.getInetAddress());
Scanner in = new Scanner(sock.getInputStream());
PrintWriter out = new PrintWriter(sock.getOutputStream());
String request = "";
request = in.next();
System.out.println("Request: " + request);
if(request.toUpperCase().equals("TIME")) {
out.println(getTime());
out.flush();
} else {
out.println("Invalid Request...");
out.flush();
}
}
} catch(Exception e) {
System.out.println(e.toString());
}
}
protected static String getTime() {
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
return (dateFormat.format(date));
}
}
クライアントは次のとおりです。
import java.io.*;
import java.util.*;
import java.net.*;
public class myClient {
protected static final String HOST = "127.0.0.1";
protected static final int PORT = 55555;
protected static Socket sock;
public static void main(String args[]) {
try {
sock = new Socket(HOST,PORT);
System.out.println("Connected to " + HOST + " on port " + PORT);
Scanner response = new Scanner(sock.getInputStream());
PrintWriter request = new PrintWriter(sock.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String txt = "";
while(!txt.toUpperCase().equals("EXIT")) {
System.out.print("prompt:");
txt = in.readLine();
request.println(txt);
request.flush();
System.out.println(response.next());
}
request.close();
response.close();
in.close();
sock.close();
} catch(IOException e) {
System.out.println(e.toString());
}
}
}
解決
このような何か別のwhileループが必要です
while(true) {
Socket sock = servsock.accept();
System.out.println("Connection from: " + sock.getInetAddress());
Scanner in = new Scanner(sock.getInputStream());
PrintWriter out = new PrintWriter(sock.getOutputStream());
String request = "";
while (in.hasNext()) {
request = in.next();
System.out.println("Request: " + request);
if(request.toUpperCase().equals("TIME")) {
out.println(getTime());
out.flush();
} else {
out.println("Invalid Request...");
out.flush();
}
}
}
他のヒント
PrintWriter
からドキュメント:
...自動フラッシュが有効になっている場合は、
println
、printf
、またはformat
メソッドのいずれかが呼び出されたときにのみ実行されます...
サーバーは print()
を呼び出しており、ストリームをフラッシュしないため、時間が送信されることはありません。 println()
を呼び出すか、明示的にストリームをフラッシュします。
また、サーバーは時刻を送信した直後に接続を閉じるため、クライアントの2番目の要求は常に失敗します...
編集:ここには興味深い癖があります- PrintWriter
を閉じてフラッシュする必要がある ( Writer
)、ただし、操作の順序により、代わりに発生する の内容は次のとおりです。
-
in.close()
は、基になるSocket
を閉じます
-
out.close()
は書き込まれたデータをフラッシュしますが、できません(ソケットが閉じられたため)
これが正確に何であるかはわかりませんが、これら2つのステートメントの順序を入れ替えると動作が変更され、おそらく out.close()
にフラッシュする機会が与えられます...
所属していません StackOverflow