1

クライアントソケットからサーバーにデータを送信しようとしていますが、データが送信されても​​、サーバーはまだデータを待機しています。その後、クライアントソケットはサーバーからのデータを待機しています。互いに待機している2つのソケットがあります。誰かが何が悪いのか説明できますか?

クライアント:

package ssd8ex3_tcp_client;

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

public class Ssd8Ex3_TCP_Client {

    private static final int SERVICE_PORT = 2000;

    public static void main(String[] args) {

        String hostname = "localhost";

        int counter = 0;
        while (counter < 1000) {
            try {
                Socket socket = new Socket(hostname, SERVICE_PORT);
                socket.setSoTimeout(50000);
                PrintStream pstream = new PrintStream( socket.getOutputStream() );
                pstream.print(counter);
                pstream.flush();

                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String s = reader.readLine();
                System.out.println("Results :" + s);
                socket.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

            counter++;
        }

    }
}

サーバ:

package ssd8ex3_tcp_server;

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


public class Ssd8Ex3_TCP_Server {

    public static final int SERVICE_PORT = 2000;

    public static void main(String[] args) {
        try {
            ServerSocket server_socket = new ServerSocket(SERVICE_PORT);

            System.out.println("Server started");

            for(;;){
                Socket nextClient = server_socket.accept();
                System.out.println("Received request from " + nextClient.getInetAddress() + ":" + nextClient.getPort());

                BufferedReader reader = new BufferedReader(new InputStreamReader(nextClient.getInputStream()));
                String s = reader.readLine();
                OutputStreamWriter out = new OutputStreamWriter(nextClient.getOutputStream());
                PrintWriter pout = new PrintWriter(out);

                pout.print(s);

                out.flush();

                nextClient.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
4

1 に答える 1

2

サーバーはを使用しますreadLine。これは完全な行を待機します。クライアントはprint、行末マーカーを追加しないものを使用します。したがって、サーバーはその行末を待機しています。

クライアントで使用するprintlnと(そして返品交換についても同じことをします)、物事は「スタック解除」されるはずです。

于 2012-04-14T15:05:10.247 に答える