1

私は初心者のプログラマーなので、これは非常に明白であり、答えを見落としている可能性があります。しかし、質問に進みます。

私は 2 つの部分からなるプログラムを持っています (この例より少し複雑ですが、状況は同じです)。プログラムには、クライアントとサーバーの間で発生する複数のメッセージがあります。クライアントにメッセージを送信するためにサーバー側に PrintWriter があり、クライアントには、送信されたメッセージを読み取るための BufferedReader があります。この例を実行すると、出力として 2 行が表示されます。最初のメッセージは両方のメッセージで、2 番目のメッセージは NULL です。私が疑問に思っているのは、2 番目のメッセージが送信される前にクライアント側で何かを実行できるように、2 番目のメッセージの準備ができるまでサーバーを基本的に停止する方法があるかどうかです。

Thread.Sleepクライアントが準備ができていると言うまでサーバーを待機させたいので、使用しないことを望んでいます。

これはクライアントです:

    public class Client{
     public void run(){
        Socket socket = null;
        InputStream in = null;
        BufferedReader reader = null;

        try{
            socket = new socket("LocalHost",1234); 
            in = socket.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in));          
        } 

        String messageFromServer = "";
        try{
            messageFromServer=reader.readLine();
        }

        System.out.println(messageFromServer);

        String messageFromServer = "";

        try{
            messageFromServer=reader.readLine();
        } 
         System.out.println(messagefromServer);

        //close everything
    }
  }

これはサーバーです:


    public class Server{
        public void run(){
           ServerSocket server = null;
           Socket client = null;
           try{
               server = new ServerSocket(1234);
               client = server.accept();
           }

            PrintWriter writer = null;
            OutputStream out = null;

            try{
                 out = client.getOutputStream();
                 writer = new PrintWriter(out, true);
            }

            writer.write("Hi I'm a server");

            //do some stuff that takes some time, user input, etc. etc.

            writer.write("I'm still a server");

            //close everything
        }    

ありがとう :)

4

2 に答える 2

1

現在コーディングしている方法の問題は、を使用しているという事実ですBufferedReaderが、サーバーはそのメッセージを改行で終了していません。

を閉じるとwriter、クライアントは EOF または EOS に到達し、読み取りのブロックを解除しているため、両方の文字列が同時に送信されているように見えます...

次のようなことをすると...

writer.write("Hi I'm a server\n");
// This will force the message to be written to the client and picked up ;)
writer.flush();
writer.write("I'm still a server\n");
writer.flush();

次に、メッセージを個別に取得します...

于 2013-07-15T05:21:17.427 に答える