我想我做错了什么。我想发送一个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的情况下,这将发生:它将尝试匹配确切的资源,如果失败,则将其广播到所有在线资源。