Google Talk接收不同jid资源的消息



我想我做错了什么。我想发送一个XMPP消息到我的GTalk id,但我不希望GTalk应用程序接收到消息,所以我正在改变接收者id的资源。

我的问题是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 -rafaespillaqu@gmail.com/myownresource453242352你不应该回应!

怎么了?

更新:

现在我从一个aSmack客户端发送消息到myapp@appspot.com/bot,它在我的客户端重新发送消息给我。

问题是GTalk为Gmail和GTalk为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);

}

客户:

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日志中看到,从aSmack收到的节不是正常类型的,而是聊天类型的。

谢谢你的帮助!

最后一件事:你可以测试什么Gmail正在做的连接从任何客户端和Gmail在同一时间,从客户端说话。Gmail正在接收你的邮件。

再次感谢。

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

参见RFC 6120, section 10.5.4:

如果'to'属性中包含的JID是localpart@domainpart/resourcepart和用户存在,但是有没有与完整的JID(节)完全匹配的连接资源是否应该像处理表单一样处理JIDlocalpart@domainpart如第10.5.3.2节所述。

如果您发送到一个无效的资源,服务器将把它当作您已将其发送到裸JID。在GoogleTalk上,这将用于所有非负优先级资源。

我认为这是故意的。IIRC GTalk将给定JID的所有消息路由到该JID的所有连接资源。如果消息具有完整的JID为to,则更是如此。

如果您发送带有JID和资源(user@yoursever/reourcex)的消息,那么接收服务器将把您的请求路由到预期的接收者。接收服务器将决定如何路由JID/资源。

标准服务器将查找与发送的JID/资源的精确匹配。如果找到,那么它将按照预期运行,消息将被传递。另一方面,如果失败,它将把消息发送到优先级最高的在线资源。如果失败,它将离线存储消息。

在Google Talk的情况下,这将发生:它将尝试匹配确切的资源,如果失败,则将其广播到所有在线资源。

最新更新