Google Talk使用不同的jid资源接收邮件

时间:2011-12-15 17:36:01

标签: google-app-engine xmpp

我想我做错了什么。 我想向我的GTalk id发送XMPP消息,但我不希望GTalk应用程序收到消息,所以我正在更改收件人JID的资源。

我的问题是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);

}

输出:

  • Rafa Espillaque,18:33 - 你不应该回应!

  • prueba-gae-gdx@appspot.com,18:33 - rafaespillaque@gmail.com/myownresource453242352您不应该回复!

怎么了?

更新:

现在我从aSmack客户端向myapp@appspot.com/bot发送消息,并在我的客户端向我重新发送消息。

问题是适用于Gmail的GTalk和适用于Android的GTalk正在注册所有已发送的消息,但他们没有收到应用响应。其他客户端不会显示我不与他们一起发送的消息。

我可以将自己的邮件隐藏到Gmail和Android吗?

我的代码:

SERVER

  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);

}

客户端:

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("rafaespillaque@gmail.com",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();
                    }

最后一件事:我在AppEngine Logs中看到,从aSmack收到的Stanza不是正常类型,而是聊天类型。

感谢您的帮助!!

最后一件事:您可以通过从任何客户端和Gmail同时连接并与客户端通话来测试Gmail正在执行的操作。 Gmail正在接收您的邮件。

再次感谢。

另一件事: 我的目标是使用XMPP通过他们的Gmail帐户与游戏的2个客户进行通信。你知道另一种选择吗?

3 个答案:

答案 0 :(得分:5)

请参阅RFC 6120, section 10.5.4

  

如果'to'属性中包含的JID属于表单   localpart@domainpart/resourcepart并且用户存在,但有   没有与完整JID完全匹配的连接资源,即节   应该像JID一样处理   localpart@domainpart部分所述的{{1}}。

如果您发送到无效资源,服务器会将其视为您已将其发送到裸JID。在GoogleTalk上,这适用于所有非负优先级资源。

答案 1 :(得分:2)

我认为这是设计上的。 IIRC GTalk将给定JID的所有消息路由到JID的所有连接资源。如果消息的完整JID为to,则甚至是这样。

答案 2 :(得分:2)

如果您使用JID和资源(user @ yoursever / reourcex)发送消息,则接收服务器会将您的请求路由到预期的接收方。接收服务器将决定如何路由JID /资源。

标准服务器将查找已发送JID /资源的完全匹配。如果找到,那么它将按预期运行并且将传递消息。如果失败,它会将消息发送到最高优先级的在线资源。如果失败,它将离线存储消息。

对于Google Talk,会发生这种情况:它会尝试匹配确切的资源,如果失败,则将其广播到所有在线资源。如果没有包含资源,也会应用相同的内容。