1

アプリケーションでatmosphereフレームワークを使用しています。

https://github.com/Atmosphere/atmosphere

AbstractReflectorAtmosphereHandlerクラスを拡張し、

-onRequest
-destroy
-onstatechanged

メソッド。

クライアントがサーバーにメッセージを送信したい場合:

subSocket.push(jQuery.stringifyJSON({ data: "blahblah", source:"client" }));

onRequest関数が呼び出されます。しかし、メッセージ

Object message = atmosphereResource.getAtmosphereResourceEvent().getMessage();

空です。

毎回呼び出されるonstatechangedを使ってみたより

(1) The remote connection gets closed, either by a browser or a proxy
(2) The remote connection reach its maximum idle time (AtmosphereResource.suspend))
(3) Everytime a broadcast operation is executed (broadcaster.broadcast)

ただし、1と2を除外した後でも

 public void onStateChange(AtmosphereResourceEvent event)
                throws IOException {
        if (source.equals("client") && !event.isResumedOnTimeout() && !event.isResuming()){       
                    System.out.println("message form client");
                    System.out.println(message.toString());
        } else {
                //normal onstatechanged code from AbstractReflectorAtmosphereHandler
        }

ただし、メッセージは2〜4回ランダムに印刷されます。一度だけ呼び出す必要があります。

だから私の質問は:onRequestメソッド内のメッセージにアクセスできますか、またはなぜonStateChangeが何度も呼び出されるのですか?

編集:jFによって与えられた答えから、私はonRequest関数内のメッセージにアクセスすることができました。(しかし、それが彼が実際に意味したものであるかどうかはわかりません)。

public void onRequest(AtmosphereResource resource) throws IOException {
    //Object message = resource.getAtmosphereResourceEvent().getMessage(); //is empty why?

    //leave connection open
    resource.suspend();

    BufferedReader reader = resource.getRequest().getReader();
    Object message = reader.readLine();

    if (message !=null){
        System.out.println("**onRequest: "+message.toString());
    }
}
4

2 に答える 2

3

で、次のようにして、リクエストの本文を読み取る必要がありますonStateChange

atmosphereResource.getRequest().getReader (or getInputStream). 
于 2013-03-20T14:13:11.307 に答える
1

多分これは他の人を助ける:

public void onRequest(AtmosphereResource resource) throws IOException { 
    //Object message = resource.getAtmosphereResourceEvent().getMessage(); //is empty why?
    //leave connection open
    resource.suspend();

    BufferedReader reader = resource.getRequest().getReader();
    Object message = reader.readLine();

    if (message !=null){
        Object obj = JSONValue.parse(message.toString());
        JSONObject jsonObject = (JSONObject) obj;
        Object source = jsonObject.get("source");

        System.out.println("**onRequest: "+message.toString());
        ArrayList frame = new ArrayList(); 
        frame.add(jsonObject.get("type"));
        frame.add(jsonObject.get("data"));
        writeQueue.add(frame);
    }
}
于 2013-03-24T15:51:02.163 に答える