2011-12-15 10 views
2

私は何か間違っていると思います。 GTalk IDにXMPPメッセージを送信したいが、受信者JIDのリソースを変更しているので、GTalkアプリケーションがメッセージを受信しないようにしたい。Googleトークで異なるjidリソースのメッセージを受信して​​います

私の問題は、thayは別のリソースを持っていますが、GTalkはすべてのメッセージを受信して​​います。

マイコード:

public void doPost(HttpServletRequest req, 
     HttpServletResponse resp) throws IOException { 

    // Parse incoming message 
    XMPPService xmpp = XMPPServiceFactory.getXMPPService(); 
    Message msg = xmpp.parseMessage(req); 
    JID jid = msg.getFromJid(); 
    String body = msg.getBody(); 

    String jidID = jid.getId().split("/")[0]; 
    JID jid2 = new JID(jidID+"/myownresource453242352"); 

    String response = jid2.getId() + " " + body; 

    // Send out response 
    msg = new MessageBuilder().withRecipientJids(jid2).withBody(response).build(); 
    xmpp.sendMessage(msg); 

} 

出力:

  • ラファEspillaque、18:33 - あなたは応じるべきではありません!

  • [email protected]、18:33 - [email protected]/myownresource453242352あなたは応答しないでください!

何が問題なのですか。

UPDATE:

は、今私はaSmackクライアントから[email protected]/botにメッセージを送ることだし、それは私のクライアントで私にメッセージを再送信されます。

問題はGTalk for Gmailで、GTalk for Androidは送信されたすべてのメッセージを登録していますが、アプリの応答を受信しません。他のクライアントは私がそれらと共に送られなかったメッセージを表示しません。

私のメッセージをGmailやAndroidに隠すことはできますか?

マイコード:

サーバ

public void doPost(HttpServletRequest req, 
    HttpServletResponse resp) throws IOException { 
    LOG.setLevel(Level.INFO); 
// Parse incoming message 
XMPPService xmpp = XMPPServiceFactory.getXMPPService(); 
Message msg = xmpp.parseMessage(req); 

LOG.info(msg.getStanza()); 

JID jid = msg.getFromJid(); 
String body = msg.getBody(); 

String response = "FullID: "+jid.getId()+" El mensaje recibido es: "+body; 

// Send out response 
msg = new MessageBuilder(). 
    withRecipientJids(jid) 
    .withMessageType(MessageType.NORMAL) 
    .withBody(response) 
    .build(); 
xmpp.sendMessage(msg); 

}

CLIENT:

ConnectionConfiguration connectionConfiguration = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com"); 
        XMPPConnection connection = new XMPPConnection(connectionConfiguration); 
        try { 
         Log.i("TAG","Trying to connect"); 
         connection.connect(); 
         Log.i("TAG","Connected"); 
         SASLAuthentication.supportSASLMechanism("PLAIN", 0); 
         Log.i("TAG","Trying to Log In"); 
         connection.login("[email protected]",mypass, mires"); 
         Log.i("TAG","Logged In"); 
        } catch (XMPPException e) { 
         e.printStackTrace(); 
         Log.i("TAG","Problem connecting or logging in"); 
        } 
        //Creating chat object for processing friend chat 
        Chat chat = connection.getChatManager().createChat(Server, new MessageListener() { 
         //Overriding process message function of MessageListener Interface which will be 
            //called whenever a message is received 
         @Override 
         public void processMessage(Chat c, Message m) { 
          //Displaying message sent by friend 
          //System.out.println(friendId+ " : " + m.getBody()); 
          Log.i("TAG", m.getBody()); 
          message = m.getBody(); 
         } 
        }); 
        try { 
         Message out = new Message(); 
         out.setBody("Definitivo22222222"); 
         out.setType(Type.normal); 
         chat.sendMessage(out); 
         Log.i("TAG", "Mensaje enviado"); 
        } catch (XMPPException e) { 
         Log.i("TAG", "No se envió el mensaje"); 
         e.printStackTrace(); 
        } 

最後の事:私はスタンザaSmack ISNから受信AppEngineのログで見てきましたノーマルタイプですがチャットタイプです。

助けてくれてありがとう!

最後のもの:クライアントとGmailから同時に接続し、クライアントと通信することで、Gmailの動作をテストできます。 Gmailがあなたのメッセージを受信して​​います。

もう一度おねがいします。

別のもの: 私のゴールキーパーは、XMPPを使用して2人のゲームクライアントを自分のGmailアカウントと通信します。あなたは別のことを知っていますか?

+0

どのGoogleトーククライアントをお使いですか? Gmail、ダウンロードクライアント(googletalk.exe)、Google+、Pidgin、その他何か? –

+0

私は共感、GTalk for WindowsとGmail – Rafaesp

答えて

2

これは設計によるものだと思います。 IIRC GTalkは、指定されたJIDのすべてのメッセージを、JIDのすべての接続リソースにルーティングします。これは、メッセージのフルJIDがtoである場合にも当てはまります。

+0

をテストしました。自分のクライアントにカスタムメッセージを送信できず、メッセージを受け取るためにGoogle Talkを避けることはできないと思いますか? 私は、この(リンク)が可能だと思いますか? http://stackoverflow.com/questions/2472617/using-xmpp-for-push-user-notifications-on-android-any-way-to-target-the-so-t – Rafaesp

5

RFC 6120, section 10.5.4を参照してください:

属性「から」に含まれるJIDの形式は [email protected]/resourcepartあり、ユーザーが存在しますが、正確、完全なJID、スタンザ に一致する 全く接続されたリソースが存在しない場合セクション10.5.3.2で説明されているように、JIDが [email protected]の形式であるかのように処理されるべきである(SHOULD)。

無効なリソースに送信すると、サーバは、それを裸のJIDに送信したかのように扱います。 GoogleTalkでは、優先順位の高い優先順位のないすべてのリソースに移動します。

+0

返信いただきありがとうございます。 私はまだ問題があります。私は質問を更新する。 – Rafaesp

2

JIDとリソース(user @ yoursever/reourcex)を使用してメッセージを送信すると、受信側のサーバーが目的の受信者に要求をルーティングします。受信側のサーバーは、JID /リソースのルーティング方法を決定します。

標準のサーバーは、送信されたJID /リソースと完全に一致するものを探します。見つかった場合、それは期待どおりに動作し、メッセージは配信されます。一方、失敗した場合は、最優先のオンラインリソースにメッセージが送信されます。それが失敗すると、メッセージはオフラインで保存されます。

Googleトークの場合、正確なリソースと一致するかどうか試行し、失敗した場合はすべてのオンラインリソースにブロードキャストします。リソースが含まれていない場合も同じことが適用されます。

関連する問題