2

クライアントクラスとサーバークラスがあります。クライアントがサーバーにメッセージを送信すると、サーバーはクライアントに応答を返し、クライアントは受信したすべてのメッセージを出力します。

例えば、

クライアントがサーバーに「A」を送信すると、サーバーはクライアント「1111」に応答を送信します。したがって、クライアントクラスで readLine() を使用してサーバーからメッセージを読み取り、クライアントがコンソールに「1111」を出力します。

クライアントがサーバーに "B" を送信すると、サーバーはクライアント "2222\n 3333" に応答を送信します。したがって、クライアントからの期待される印刷出力は次のとおりです。

「2222」

「3333」

したがって、サーバーからクライアントへの応答メッセージは、クライアントからサーバーに送信されるメッセージに応じて、1 行または 2 行になる場合があります。

私の質問は、サーバーからクライアントに送信されるメッセージを readLine() を使用して読み取る方法です。具体的には、次のコードを使用すると、

String messageFromServer;
while(( messageFromServer = inputStreamFromServer.readLine()) != null) {
    println(messageFromServer);
}

readLine() は最初の行を読み取ると停止するため、クライアントからサーバーにメッセージを送信し続けても、最初の行のみを印刷し、他には何も印刷しません。

更新: より具体的には、サーバーから一度に1行または複数行を含むメッセージを読み取るために、クライアントクラスでいくつかのメソッドを探しています。サーバーからクライアントに送信されるメッセージの形式を変更したくない場合、クライアント側でそれを行う方法があるかどうか疑問に思っています。

更新 2 私の質問をより明確にするために、いくつかのサンプル コードを以下に示します。

これはサーバーです:

import java.net.*;
import java.io.*;

public class Server {
 public static void main(String[] args) throws IOException {

  ServerSocket serverSocket = null;
  try {
    serverSocket = new ServerSocket(1234);
} catch (IOException e) {
    System.err.println("Could not listen on port: 1234.");
    System.exit(1);
}

Socket clientSocket = null;
try {
    clientSocket = serverSocket.accept();
} catch (IOException e) {
    System.err.println("Accept failed.");
}
 System.out.println("Connected");


PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

String textFromClient =null;
String textToClient =null;
textFromClient = in.readLine(); // read the text from client
if( textFromClient.equals("A")){
   textToClient = "1111";
}else if ( textFromClient.equals("B")){
   textToClient = "2222\r\n3333";
}


out.print(textToClient + "\r\n");  // send the response to client
 out.flush();
 out.close();
 in.close();
 clientSocket.close();
 serverSocket.close();
 }
}

クライアント:

public class Client {
public static void main(String[] args) throws IOException {

    Socket socket = null;
    PrintWriter out = null;
    BufferedReader in = null;
    BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
    try {
        socket = new Socket("localhost", 1234);
        out = new PrintWriter(socket.getOutputStream(), true);
        in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host");
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for the connection");
    }
    System.out.println("Connected");

    String textToServer;

    while((textToServer = read.readLine())!=null){
        out.print(textToServer + "\r\n" );  // send to server
        out.flush();

        String messageFromServer =null;
        while(( messageFromServer = textToServer=in.readLine()) != null){
            System.out.println(messageFromServer);
        }
    }
    out.close();
    in.close();
    read.close();
    socket.close();
}

private static void debug(String msg)
{
    System.out.println("Client: " + msg);
}
 }
4

3 に答える 3

2

サーバーから送信されるデータの形式を変更する必要はなく、readLine()は機能するはずですが、応答を書き込んだ後、サーバーがOutputStreamをフラッシュまたは閉じていない可能性があります。
readLine()の呼び出しはハングしていますか?サーバーコードを管理していますか?もしそうなら、あなたはそれを含めることができますか?

あなたが期待するように機能する改訂されたクラス:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class ClientServerTest2
{

    public static void main(String[] args) throws Exception
    {
        Thread serverThread = new Thread(new Server());
        serverThread.start();
        Thread clientThread = new Thread(new Client());
        clientThread.start();

        serverThread.join();
        clientThread.join();
    }

    private static class Server implements Runnable
    {
        @Override
        public void run()
        {
            ServerSocket serverSocket = null;
            try
            {
                serverSocket = new ServerSocket(1234);

                Socket clientSocket = null;
                clientSocket = serverSocket.accept();
                debug("Connected");

                PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
                BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                String textFromClient = null;
                String textToClient = null;
                textFromClient = in.readLine(); // read the text from client
                debug("Read '" + textFromClient + "'");
                if ("A".equals(textFromClient))
                {
                    textToClient = "1111";
                }
                else if ("B".equals(textFromClient))
                {
                    textToClient = "2222\r\n3333";
                }

                debug("Writing '" + textToClient + "'");
                out.print(textToClient + "\r\n"); // send the response to client
                out.flush();
                out.close();
                in.close();
                clientSocket.close();
                serverSocket.close();
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

        }

        private static void debug(String msg)
        {
            System.out.println("Server: " + msg);
        }
    }

    private static class Client implements Runnable
    {

        @Override
        public void run()
        {
            Socket socket = null;
            PrintWriter out = null;
            BufferedReader in = null;
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
            try
            {
                socket = new Socket("localhost", 1234);
                out = new PrintWriter(socket.getOutputStream(), true);
                in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                debug("Connected");

                String textToServer;

                textToServer = read.readLine();
                debug("Sending '" + textToServer + "'");
                out.print(textToServer + "\r\n"); // send to server
                out.flush();

                String serverResponse = null;
                while ((serverResponse = in.readLine()) != null)
                    debug(serverResponse); // read from server and print it.

                out.close();
                in.close();
                read.close();
                socket.close();
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    private static void debug(String msg)
    {
        System.out.println("Client: " + msg);
    }
}
于 2013-03-18T16:52:58.457 に答える
0

while(( messageFromServer = inputStreamFromServer.readLine() != null)に変更while(( messageFromServer = inputStreamFromServer.readLine()) != null)

実際、これはコンパイルさえすべきではありません....

于 2013-03-18T16:02:46.000 に答える
0

これは回避策です。

あなたの場合のように複数の文字列を送信したい場合: "2222\n 3333".

「2222 3333」の 2 つの文字列の間に区切り文字 ( :など) を追加して送信できます。:

次に、サーバー側から次のように書き込みを呼び出すことができます

clientOut.write("2222: 3333\n");

クライアント側では、受信した文字列を解析します:

messageFromServer = inputStreamFromServer.readLine();
String strArray[] = messageFromServer.split(":");

strArray[0] : 2222

strArray[0] : 3333
于 2013-03-18T16:05:28.363 に答える