私はサーバークラスとクライアントクラスを持っています。サーバーとクライアントは互いにメッセージを交換します。このコードはテスト目的で作られたものであり、動作するはずの方法は次のとおりです。パーティー(クライアント/サーバー)がメッセージを送信すると、これまで相手が送信したすべてのメッセージを受け取ります(InputStream空です)。これを実装するコードの一部は、クライアントの間の内側に位置しており、サーバーのforループさ:ソケット出力が受信されていません
クライアント:
public class ClientSocketRunner {
private static String ip="localhost";
private static int port=440;
private static String client="Client";
private static String server="Server";
public static void main(String[] args) throws Exception
{
ClientSocketRunner socket_runner=new ClientSocketRunner();
socket_runner.run();
}
private void run() throws Exception
{
Socket client_socket=new Socket(ip, port);
OutputStream os=client_socket.getOutputStream();
InputStream is=client_socket.getInputStream();
PrintStream make_output=new PrintStream(os);
BufferedReader read_input=new BufferedReader(new
InputStreamReader(is));
make_output.println("Hello, I'm the Client");
System.out.println(read_input.readLine());
System.out.println("my port: "+client_socket.getLocalPort());
String line=null;
BufferedReader user_input=new BufferedReader(new
InputStreamReader(System.in));
while (!(line=user_input.readLine()).equals("-1"))
{
make_output.println(client+": "+line);
make_output.flush();
System.out.println("sent");
while (is.available()>0)
{
System.out.println(read_input.readLine());
}
System.out.println("bytes: "+is.available());
}
while (is.available()>0)
{
System.out.println(read_input.readLine());
}
}
サーバー:
public class ServerSocketRunner {
private static int port=440;
private static String client="Client";
private static String server="Server";
public static void main(String[] args) throws Exception
{
ServerSocketRunner ssRunner=new ServerSocketRunner();
ssRunner.run();
}
public void run() throws Exception
{
ServerSocket server_socket=new ServerSocket(port);
Socket socket=server_socket.accept();
InputStream sin=socket.getInputStream();
OutputStream sout=socket.getOutputStream();
BufferedReader read_input=new BufferedReader(new InputStreamReader(sin));
PrintStream make_output=new PrintStream(sout);
System.out.println(read_input.readLine());
make_output.println("Good to meet you, I'm the Server");
System.out.println("my port: "+socket.getLocalPort());
String line;
BufferedReader user_input=new BufferedReader(new InputStreamReader(System.in));
for (line=user_input.readLine(); !(line.equals("-1")); line=user_input.readLine())
{
make_output.println(server+": "+line);
make_output.flush();
System.out.println("sent");
while (sin.available()>0)
{
System.out.println(read_input.readLine());
}
}
}
}
しかし、期待どおりに動作しません。 。複数行の入力を行うと、各行に印刷(「送信」)されますが、相手に行くと、いくつかの行を送信して、予想される入力が表示されません。当事者間の次のカップルの交際まで。 何が問題なのですか?
あなたは正しく終了の流れをチェックされていませんがあなたはNPEを手に入れます。あなたは古典的な 'available()'の誤用をしています。完全な行が利用できない場合に 'readLine()'でブロックされるので、無意味です。 – EJP
@EJPだから、問題は、私はあまりにも短い行をタイプするので、彼らは反対側で読むことができないということですか?しかし、なぜこの問題は私が単に次のようにユーザの入力を読み込んで表示すると発生しないのですか? .equals( " - 1"))、 'System.out.println(" User: "+ line);'?最短の行であっても正しく正確に表示されます。 – parsecer
いいえ、私は問題が何であるかは言及していません。私はあなたが 'available()'を無意味に呼んでいるとコメントしました*。それを除く。 – EJP