5

作成しているクライアントサーバーアプリがあり、サーバー上のオブジェクトを読み取るときに少し問題が発生します。

サーバーがクライアントソケットに接続した後、オブジェクトの入力ストリームと出力ストリームを作成し、それらをservice()メソッドに渡します。そこでは、クライアントからのさまざまな種類のメッセージを処理することになっています。クライアント(つまり、Message私のデザインのオブジェクト)からメッセージをうまく受け取ることができます。しかしもちろん、私がやりたいのは、メッセージを取得して処理し、応答できるようにループを作成することです。

これまでのところ、私のコードは1つのメッセージに対してのみ機能します。ループを追加すると、すべての反復で何が起こったのか、クライアントがソケットを介して新しいメッセージを送信する機会を得る前に、サーバーは同じメッセージを何度も読み続けました(少なくともこれが起こっていると思います) 。

したがって、私が本当に行う必要があるのは、service()メソッドに新しい入力を待機させる方法を理解することです。何か案は?それとも私はこれに間違って近づいていますか?反復ごとに新しいOISを作成する必要がありますか...?いくつかのコード:

public void service(ObjectInputStream input, ObjectOutputStream output) throws IOException, Exception {

    _shouldService = true;

    while (_shouldService) {
                    // It just keeps reading the same message over and over
                    // I need it to wait here until the client sends a new message
                    // Unless I'm just approaching this all wrong!
        NetworkMessage message = (NetworkMessage) input.readObject();

        NetworkMessageHeader header = message.getHeader();

        String headerType = header.getType();

        if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeConnect)) {
            doLoginForMessage(message, output);
        } else if (headerType.equals(NetworkMessageHeader.NetworkMessageHeaderTypeFiles)) {
            doFilesList(message, output);
        } else {
            System.out.println("Unrecognized header type: " + headerType);

        }
    }
}
4

1 に答える 1

2

ObjectOutputStreamはオブジェクト表現をキャッシュし、クライアント側から同じインスタンスを何度も再送信しているかどうかを検出しませんが、変更が加えられています。これがシナリオである場合は、reset各送信の前にストリームを呼び出す必要があります。

NetworkMessage message = new NetworkMessage();
for(;;) {
  message.setProperty(whatever);
  oos.reset();
  oos.writeObject(message);
}
于 2012-02-21T22:53:04.150 に答える