0

別のクラスからの計算結果に基づくメッセージを送信するサーバーを作成しようとしています。

私の質問は、計算結果が別のクラスからのものであるため、結果の準備が整うまでサーバーを一時停止するにはどうすればよいですか? また、結果をサーバー クラスに渡し、結果を送信するにはどうすればよいですか?

public class MyServer {
    ServerSocket providerSocket;
    Socket connection = null;
    static ObjectOutputStream out;
    ObjectInputStream in;
    String message;
    public static String myServerSend;

    BufferedReader data = new BufferedReader(data);

    MyServer() {}

    void run() {
        try {
        providerSocket = new ServerSocket(2013, 10);
        System.out.println("Waiting for connection");

        connection = providerSocket.accept();

        out = new ObjectOutputStream(connection.getOutputStream());
        out.flush();
        in = new ObjectInputStream(connection.getInputStream());

        do {
            try {
                message = (String) in.readObject();
                System.out.println("server receive>" + message);


                // HERE IS MY QUESTION
                // myServerSend is the result from other class, 
                                    //How can I pause the server here till myServerSend is ready???????
                sendMessage(myServerSend);


            } catch (ClassNotFoundException classnot) {
                System.err.println("Data received in unknown format");
            }
        } while (!message.equals("bye"));

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

}


    //write msg into ObjectOutputStream
public static void sendMessage(String msg) {
    try {
        out.writeObject(msg);
        out.flush();
        System.out.println("server send>" + msg);
    } catch (IOException ioException) {
        ioException.printStackTrace();
    }
}
4

3 に答える 3

0

これを達成するためのいくつかのオプションがあります:

1-Thread計算用のを作成し、呼び出しjoinて、サーバーがスレッドの終了を待機するようにします

Thread thread = new Thread() {
   public void run(){
      // Call your calculation class
   }
}
thread.start();

thread.join(); // surround with try and catch

// or you can use to timeout if the calculation took long
// thread.join(MAX_TIME_MILLIS);

sendMessage(myServerSend);

2-あなたとクラスwait/notifyの間の共有オブジェクトで使用するservercalculation

3-semaphoreで初期化されたオブジェクトを使用し、サーバークラスを呼び出して、計算が終了した後、待機して呼び出し0ます。例については、ここで私の回答を参照してくださいacquirerelease

于 2013-02-14T07:48:39.447 に答える
0

あなたが試したことと、試したことを破棄した理由に関する具体的な情報がなければ、ここにいくつかの選択肢があります。

  1. 他のクラスを直接呼び出して、結果が準備できるまで待ちます。計算に時間がかかりすぎる場合、これは良い考えではないかもしれませんが、そうでない場合は、これが最も簡単な方法です。

  2. ポーリングを適用し、一定時間サーバーをスリープ状態にして、応答を待っている間にリソースを使い果たすことがないようにすることができます。

  3. 同期されたオブジェクトと並行性を、wait メソッドと notify メソッドを介して使用します。これに関するいくつかの便利なリンク: 1 2 3

于 2013-02-14T07:37:38.507 に答える
0

使用する

    Thread.sleep(30000); // Milli secs - 30 secs -- Put your sleep time
sendMessage(myServerSend);
于 2013-02-14T07:33:01.147 に答える