ソケットを使用して理解を深めるために、単純なサーバー/クライアント アプリケーションを作成しようとしています。サーバーとクライアント間の単一回線通信を正常に取得できます。たとえば、クライアントがメッセージをサーバーに送信し、サーバーが確認して単一のメッセージを返信します。
問題は、BufferedReader に複数の行がある場合に、サーバーからクライアントへの受信応答を読み取ろうとするときです。
例...
サーバーとクライアントは、互いに 1 行を提供します。
import java.io.*;
import java.net.*;
import java.awt.*;
class Server {
public static void main(String args[])throws IOException
{
Server myServ = new Server();
myServ.run();
}//end main
public void run() throws IOException
{
ServerSocket serSKT = new ServerSocket(729);
Socket socket = serSKT.accept();
BufferedReader BR = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter PW = new PrintWriter(socket.getOutputStream());
String fromClient = BR.readLine();
System.out.println(fromClient);
if(fromClient !=null)
{PW.println("Server giving response to client");PW.flush();}
}}//end class server
クライアント:
import java.io.*;
import java.net.*;
class Client
{
public static void main(String args[])throws IOException
{
Client myCli = new Client();
myCli.run();
}
public void run() throws IOException
{
int port = 729;
Socket mySkt = new Socket("localhost",port);
PrintWriter myPW = new PrintWriter(mySkt.getOutputStream(),true);
BufferedReader myBR = new BufferedReader(new InputStreamReader(mySkt.getInputStream()));
myPW.println("Message from client to server");
String temp=myBR.readLine();
System.out.println(temp);
}}
したがって、上記は正常に機能します..forループを使用して10行のテキストをサーバーに出力し、サーバーからクライアントに10行を戻そうとすると、問題が発生します。たとえば..これがサーバーとクライアントです..
import java.io.*;
import java.net.*;
import java.awt.*;
class Server {
public static void main(String args[])throws IOException
{
Server myServ = new Server();
myServ.run();
}//end main
public void run() throws IOException
{
ServerSocket serSKT = new ServerSocket(729);
Socket socket = serSKT.accept();
BufferedReader BR = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter PW = new PrintWriter(socket.getOutputStream());
String fromClient = null;
while((fromClient = BR.readLine())!=null)
{
System.out.println(fromClient);//this is being printed successfully
}
if(fromClient !=null)
{
for(int i=0;i<10;i++){
PW.println("Server giving response to client"+i);}
PW.flush();}
}}//end class server
クライアント:
import java.io.*;
import java.net.*;
class Client
{
public static void main(String args[])throws IOException
{
Client myCli = new Client();
myCli.run();
}
public void run() throws IOException
{
int port = 729;
Socket mySkt = new Socket("localhost",port);
PrintWriter myPW = new PrintWriter(mySkt.getOutputStream(),true);
BufferedReader myBR = new BufferedReader(new InputStreamReader(mySkt.getInputStream()));
for(int i =0;i<10;i++)
myPW.println("Message from client to server"+i);
String temp=null;
while((temp=myBR.readLine())!=null){
System.out.println(temp);}
}}
上記はメッセージをサーバーに10回出力し、サーバーはクライアントが正常に送信したものを表示します。
while((fromClient = BR.readLine())!=null)
{
System.out.println(fromClient);//this is being printed successfully
}
私が理解していないのは、クライアントが「サーバーがクライアントに応答を与えています」というメッセージを取得せず、コンソールに出力しない理由です。
String temp=null;
while((temp=myBR.readLine())!=null){
System.out.println(temp);} //should be printing "Server giving repsonse to client"
長くて申し訳ありませんが、ありがとうございますが、うまくいきません!
****編集* **
他の誰かがこの問題に遭遇した場合に備えて、これはクライアント クラスの printwriter にコマンドを出力して、サーバーが終了したことを認識できるようにすることで解決されました。例えば:
for(int i =0;i<10;i++){
myPW.println("Message from client to server"+i);}
myPW.println("Finished");
サーバークラスでは、送信されるテキストを「Finished」コマンドでチェックする必要があります。そうであれば、whileループから抜け出し、クライアントへの返送を開始します。BufferedReaderがnullになる唯一の方法は、それは閉じているので、無限ループしています。みんな助けてくれてありがとう。
while((fromClient = BR.readLine())!=null)
{
if(fromClient.equals("Finished"))
{
break;
}
System.out.println(fromClient);
}