2011-12-15 2 views
2

나는 뭔가 잘못하고 있다고 생각합니다. GTalk ID에 XMPP 메시지를 보내고 싶지만 GTalk 앱이 메시지를 수신하지 못하게하여받는 사람 JID의 리소스를 변경하려고합니다.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); 

} 

가 출력 :

무엇이 잘못 되었습니까?

UPDATE :

지금 내가 aSmack 클라이언트에서 [email protected]/bot하는 메시지를 전송하고있어 내 클라이언트에서 나에게 메시지를 재전송한다.

문제는 GTalk for Gmail이며 Android 용 GTalk는 보낸 모든 메시지를 등록하지만 앱 응답을받지 못합니다. 다른 클라이언트는 내가 보내지 않은 메시지를 표시하지 않습니다.

내 메시지를 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에서 수신하는 App Engine 로그 검색된 일반 유형이지만 채팅 유형입니다.

도움 주셔서 감사합니다.

마지막 항목 : 클라이언트와 Gmail에서 동시에 연결하고 클라이언트와 통화하여 Gmail의 기능을 테스트 할 수 있습니다. Gmail에서 메시지를 수신하고 있습니다.

다시 한번 감사드립니다.

또 다른 것 : 나의 goalis는 XMPP를 사용하여 게임의 2 클라이언트를 Gmail 계정과 통신합니다. 대안을 알고 있습니까?

+0

어떤 Google 토크 클라이언트를 사용하고 있습니까? Gmail, 다운로드 클라이언트 (googletalk.exe), Google+, 피진, 다른 것? –

+0

필자는 Empathy, GTalk for Windows 및 Gmail – Rafaesp

답변

2

이것은 의도적으로 설계된 것입니다. IIRC GTalk는 주어진 JID에 대한 모든 메시지를 JID의 모든 연결된 자원으로 라우팅합니다. 메시지의 전체 JID가 to 인 경우에도 마찬가지입니다.

+0

에서 테스트했습니다. 내 고객을 위해 맞춤 메시지를 보내고 Google 토크가 메시지를 수신하지 못하도록한다고 생각합니까? 제 말은이 (링크)가 가능하다고 생각합니까? http://stackoverflow.com/questions/2472617/using-xmpp-for-push-user-notifications-on-android-any-way-to-target-these-so-t – Rafaesp

5

RFC 6120, section 10.5.4 항목 : JID가에 포함 된 경우

속성의 형식은 [email protected]/resourcepart이며 사용자가 존재하지만 정확하게 전체 JID, 스 D 일치 에는 연결된 자원이 없다 '에' 섹션 10.5.3.2에서 설명한대로 JID가 [email protected] 양식 인 것처럼 처리해야합니다.

유효하지 않은 리소스로 보내면 서버는 마치 해당 JID로 보낸 것처럼 취급합니다. GoogleTalk에서는 우선 순위가없는 우선 순위가 아닌 모든 리소스로 이동합니다.

+0

답장을 보내 주셔서 감사합니다. 아직 문제가 있습니다. 나는 질문을 업데이트한다. – Rafaesp

2

JID와 리소스 (user @ yoursever/reourcex)를 사용하여 메시지를 보내면 수신 서버가 요청한 수신자에게 요청을 라우팅합니다. 수신 서버는 JID/자원을 라우트하는 f}을 결정합니다.

표준 서버는 보낸 JID/자원과 정확히 일치하는 것을 찾습니다. 발견되면 예상대로 작동하고 메시지가 배달됩니다. 반면에 실패하면 가장 우선 순위가 높은 온라인 리소스로 메시지를 보냅니다. 실패하면 메시지를 오프라인으로 저장합니다.

Google 토크의 경우 정확한 리소스를 검색하려고 시도하고 실패하면 모든 온라인 리소스로 브로드 캐스트합니다. 자원이 포함되지 않은 경우에도 동일하게 적용됩니다.

관련 문제