0

目的:サーバーにデータを送信し、サーバーに何かを返してもらい、サーバーが返送したものを印刷する

問題:アウトストリームを閉じると、サーバーにデータが送信されますが、入力ストリームが機能せず、サーバーが提供しようとしているものを受信できません。flush()を使用してサーバーにデータを送信すると、サーバーはデータを受信しません。私は文字通り3時間これに固執しています。読み取りと書き込みを同時に行うにはどうすればよいですか。

Client.java

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

class Client {
    public static void main(String args[]) {
        String data = "head";
        try {
            Socket skt = new Socket("server", 5050);
            PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
            BufferedReader in = new BufferedReader(new InputStreamReader(skt.getInputStream()));
            out.print(data);
            out.close();

            System.out.println("Sent data");
            while (!in.ready()) {
            }

            String input = in.readLine();
            System.out.println(input);

            out.close();
            in.close();
            skt.close();
        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n" +e.toString());
        }
    }
}

Server.java

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

class Server {
    public static void main(String args[]) {
        String data;
        String input;
        try {
            ServerSocket srvr = new ServerSocket(5050);
            Socket skt = srvr.accept();
            BufferedReader in = new BufferedReader(new InputStreamReader(
                    skt.getInputStream()));
            PrintWriter out = new PrintWriter(skt.getOutputStream(), true);

            // /////Waits for message from client/////////
            while (!in.ready()) {
            }
            // ///////////////////////////////////////////

            input = in.readLine(); // Read the message
            System.out.println("Received String input: " + input);
            // Send output to client
            System.out.println("After output");
            if (input.equals("head"))
                data = "haha";
            else
                data = "Wtf did you send me";
            Thread.sleep(2000);
            out.print(data);
            // ///////////////////

            System.out.println("Sent data: " + data);
            in.close();
            out.close();
            skt.close();
            srvr.close();
        } catch (Exception e) {
            System.out.print("Whoops! It didn't work!\n");
        }

    }
}
4

1 に答える 1

2

クライアントには次のものがあります。

out.print(data);
out.close();

そしてあなたのサーバーには:

input = in.readLine();

クライアントは改行文字なしでメッセージを送信します-それin.ready()本当である理由です。さらに、フラッシュする代わりにPrintWriterを閉じます(プログラムの最後でストリームも閉じます)。その行を次のように変更した場合:

out.println(data); // sends message with new line character
out.flush();       // unnecessary

クライアントがメッセージを送信します。サーバーがメッセージを送信する場合も同じです。print代わりに使用しますprintlnが、クライアントはreadLineその読み取りを使用して改行文字まで読み取ります。より正確には(BufferedReader | readLine()):

1行のテキストを読み取ります。改行は、改行('\ n')、キャリッジリターン('\ r')、またはキャリッジリターンの直後に改行が続くいずれかによって終了したと見なされます。

"server"もう1つ、ホスト名を使用してサーバーに接続しています。私のテストでは、これをに変更しました"localhost"。多分他の間違いがありますか?

于 2012-10-31T08:14:51.880 に答える