Клиент Smack для обмена сообщениями, кроме Chat Text - PullRequest
0 голосов
/ 11 июля 2010

client1 может отправить текстовое сообщение client2, используя

connection.getChatManager().createChat(to, this).sendMessage(message);

Как отправить сообщение другого типа: например, сообщение INFO? (клиент1 к клиенту2)?

Поскольку я хочу, сообщение INFO не должно отображаться в окне чата .... возможно ли это? используя smack, библиотеку smackx.

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 30 июля 2010

Что вы хотите сделать, это добавить расширение к вашему текстовому сообщению.Вот приблизительное руководство.

Chat chat = connection.getChatManager().createChat(to, this);
Message message = new Message(to, Message.Type.chat);
message.setBody("hello");
message.setProperty(prop0, val0);
message.setProperty(prop1, val1);
chat.sendMessage(message)

Свойства хранятся в отдельном пространстве имен (для просмотра используйте toXML()) и не будут отображаться в окне чата.С другой стороны, приложения используют getProperty() для извлечения значения.

Если вам нужны не пары ключ / значение, а структурированные данные, используйте addExtension() в теле сообщения.Это немного сложнее, потому что вам нужно расширить PacketExtension, предоставить собственное пространство имен.Возможно, вам даже придется написать PacketExtensionProvider.

0 голосов
/ 28 июня 2018

Более сложный пример расширения сообщения:

Message videoMsg = new Message();
VideoChatRTP videoXml = new VideoChatRTP();
videoXml.setVideoType(VideoMediaType.REQUEST);
videoXml.setAddress(address);
videoMsg.setTo(receive);
videoMsg.addExtension(videoXml);
XMPPConnection conn = BaseService.getInstance().getConnection();
conn.sendPacket(videoMsg);

Класс расширения VideoChatRIP должен реализовывать PacketExtension:

public class VideoChatRTP implements PacketExtension {
    private VideoMediaType videoType;
    private String address;
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public VideoMediaType getVideoType() {
        return videoType;
    }
    public void setVideoType(VideoMediaType videoType) {
        this.videoType = videoType;
    }
    public static final String NAME = "jingle";
    public static final String NAME_SPACE = "com:roger:video";
    public VideoChatRTP() {
        super();
    }
    @Override
    public String getElementName() {
        return NAME;
    }
    @Override
    public String getNamespace() {
        return NAME_SPACE;
    }
    @Override
    public String toXML() {
        StringBuffer sb = new StringBuffer();
        sb.append("<jingle").append(" xmlns=\"").append(NAME_SPACE).append(
                "\">");
        sb.append("<type>").append(videoType).append("</type>");
        sb.append("<ipAddress>").append(address).append("</ipAddress>");
        sb.append("</jingle>");
        return sb.toString();
    }
}

Слушатель:

ProviderManager.getInstance().addExtensionProvider(VideoChatRTP.NAME, VideoChatRTP.NAME_SPACE, new VideoChatReceive());

Обработка:

public class VideoChatReceive implements PacketExtensionProvider {
    @Override
    public PacketExtension parseExtension(XmlPullParser parser)
            throws Exception {
        boolean done = false;
        String requestType = "asdasd";
        String ipAddress = "asdasd";
        while (!done) {
            int eventType = parser.next();
            String name = parser.getName();
            if (eventType == XmlPullParser.START_TAG) {
                if (name.equals("type")) {
                    requestType = parser.nextText();
                }
                if (name.equals("ipAddress")) {
                    ipAddress = parser.nextText();
                }
            }
            if (eventType == XmlPullParser.END_TAG) {
                if (name.equals("jingle")) {
                    done = true;
                }
            }
        }
        VideoChatRTP videoRtp = new VideoChatRTP();
        videoRtp.setVideoType(VideoMediaType.valueOf(requestType));

        videoRtp.setAddress(ipAddress);
        return videoRtp;
    }
}
0 голосов
/ 28 июня 2018

Вот пример для расширения сообщения. Базовая структура XML протокола XMPP:

<message  
    from='sender_jid'  
    to='receiver_jid'  
    type='message_type'>  
  <body> content </body>  
</message> 

Процесс отправки сообщений:

//build chat  
Chat chat = chatManager.createChat("jid");  

//build extension  
UserInfo4XMPP userInfo4XMPP = new UserInfo4XMPP();  
userInfo4XMPP.setNameText("userx");  
userInfo4XMPP.setUrlText("http://www.liaoku.org/");  

//build message  
Message message = new Message();  
message.setBody("hello");  
message.addExtension(userInfo4XMPP);// add the extension  

//send  
chat.sendMessage(message); 

UserInfo4XMPP определяется как:

import org.jivesoftware.smack.packet.ExtensionElement;  

public class UserInfo4XMPP implements ExtensionElement{  

    private String elementName = "userinfo";   
    private String nameElement = "name";  
    private String urlElement = "url";  
    private String nameText = "";  
    private String urlText = "";  

    @Override  
    public String getElementName() {  
        return elementName;  
    }  

    @Override  
    public CharSequence toXML() {  
        StringBuilder sb = new StringBuilder();  

        sb.append("<");  
        sb.append(elementName);  
        sb.append(">");  

            sb.append("<");  
            sb.append(nameElement);  
            sb.append(">");  
            sb.append(nameText);  
            sb.append("</");  
            sb.append(nameElement);  
            sb.append(">");  

            sb.append("<");  
            sb.append(urlElement);  
            sb.append(">");  
            sb.append(urlText);  
            sb.append("</");  
            sb.append(urlElement);  
            sb.append(">");  

        sb.append("</");  
        sb.append(elementName);  
        sb.append(">");  

        return sb.toString();  
    }  

    @Override  
    public String getNamespace() {  
        return "";  
    }  

    public String getNameText() {  
        return nameText;  
    }  

    public void setNameText(String nameText) {  
        this.nameText = nameText;  
    }  

    public String getUrlText() {  
        return urlText;  
    }  

    public void setUrlText(String urlText) {  
        this.urlText = urlText;  
    }  
}
...