0

ソケットを使用して理解を深めるために、単純なサーバー/クライアント アプリケーションを作成しようとしています。サーバーとクライアント間の単一回線通信を正常に取得できます。たとえば、クライアントがメッセージをサーバーに送信し、サーバーが確認して単一のメッセージを返信します。

問題は、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);
}
4

3 に答える 3

2

サーバーで while() ループを終了しないようです.10行目以降、サーバーは別の行(および別の行など)を待機します。クライアントは、たとえば特別な行を送信して、送信が完了したことをサーバーに通知する必要があります。次に、サーバーの while ループを終了し、送信を開始する必要があります。

于 2013-02-04T13:03:40.393 に答える
1

問題は次のとおりだと思います。

while((fromClient = BR.readLine())!=null)
{
System.out.println(fromClient);//this is being printed successfully
}

BR.readLine()ストリームが終了するまで戻りませんnull(たとえば、閉じている/切断されている)。これをブレーク条件として使用しないでくださいreadLine()。ストリームにさらにデータが表示されるのを内部で待機します。

于 2013-02-04T13:06:12.073 に答える
1

クライアントがストリームを閉じるのを待っています。つまり、br.readLine() == null何かを送信する前です。これが発生した後fromClientはnullになります。その場合、とにかく何も送信しません

試してみることをお勧めします

for (String s; (s = BR.readLine())!=null;) {
    System.out.println(s);
    PW.println("Server response to " + s);
}
于 2013-02-04T13:14:13.070 に答える