java中如何通过Smack实现流管理?

     2023-02-24     44

关键词:

【中文标题】java中如何通过Smack实现流管理?【英文标题】:how to implement Stream Management through Smack in java? 【发布时间】:2017-03-21 08:58:30 【问题描述】:

如何使用 smack 4.1 中的 XEP 198(流管理)使用 java ,请分享一些参考。

我正在使用 java 代码将消息从 smack 发送到 spark

 private static String username = "test";
        private static String password = "test123";

        public static class MessageParrot implements PacketListener 
            private XMPPConnection xmppConnection;

            public MessageParrot(XMPPConnection conn) 
                xmppConnection = conn;
            

            public void processPacket(Packet packet) 
                Message message = (Message)packet;
                if(message.getBody() != null) 
                    String fromName = StringUtils.parseBareAddress(message.getFrom());
                    System.out.println("Message from " + fromName + "\n" + message.getBody() + "\n");
                    Message reply = new Message();
                    reply.setTo(fromName);
                    reply.setBody("I am a Java bot. You said: " + message.getBody());
                    xmppConnection.sendPacket(reply);
                
            
        


        public static void main(String[] args ) 




            System.out.println("Starting IM client");

            // gtalk requires this or your messages bounce back as errors
            ConnectionConfiguration connConfig = new ConnectionConfiguration("domain.com", 5222);
            XMPPConnection connection = new XMPPConnection(connConfig);

            try 
                connection.connect();
                System.out.println("Connected to " + connection.getHost());
             catch (XMPPException ex) 
                //ex.printStackTrace();
                System.out.println("Failed to connect to " + connection.getHost());
                System.exit(1);
            
            try 
                connection.login(username, password);
                System.out.println("Logged in as " + connection.getUser());

                Presence presence = new Presence(Presence.Type.available);

                connection.sendPacket(presence);

             catch (XMPPException ex) 
                //ex.printStackTrace();
                // XMPPConnection only remember the username if login is succesful
                // so we can''t use connection.getUser() unless we log in correctly
                System.out.println("Failed to log in as " + username);
                System.exit(1);
            

            PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
            connection.addPacketListener(new MessageParrot(connection), filter);

          /*  if(args.length > 0) */
                // google bounces back the default message types, you must use chat
                Message msg = new Message("test2@domain.com", Message.Type.chat);
                msg.setBody("hi");
              //  msg.addExtension(new DeliveryReceipt(msg.getPacketID()));

               /* XHTMLExtension xhtmlExtension = new XHTMLExtension();
                xhtmlExtension.addBody(
                "<body>My lord, dispatch; read o'er these articles.</body><request xmlns='urn:xmpp:receipts'/>");
                msg.addExtension(xhtmlExtension);*/


               /* MessageEventManager.addNotificationsRequests(msg, true, true, true, true);
                DeliveryReceiptManager.addDeliveryReceiptRequest(msg);*/
                connection.sendPacket(msg);


            System.out.println("Press enter to disconnect\n");

            try 
                System.in.read();
             catch (IOException ex) 
                //ex.printStackTrace();
            

            connection.disconnect();
        

通过这个我可以和两个客户端聊天,一个来自 smack,另一个来自 spark,如何在这里实现流管理?

【问题讨论】:

【参考方案1】:

创建连接对象后使用下面的代码

 connection.setUseStreamManagement(true);
 connection.setUseStreamManagementResumptionDefault(true);

之后查看&lt;enable xmlns='urn:xmpp:sm:3' resume='true'/&gt; 的日志,这意味着客户端想要使用流管理。服务器将响应此(如果支持)&lt;enabled xmlns='urn:xmpp:sm:3' id='.......' resume='true' max='1'/&gt;,这意味着流现已启用

完成后,如果您不断检查日志,您会发现 &lt;r xmlns='urn:xmpp:sm:3'/&gt;&lt;a xmlns='urn:xmpp:sm:3' h='1'/&gt; 在客户端和服务器之间进行交换。

【讨论】:

java用smack实现简单地通过openfire与其他人进行聊天

import java.util.Objects;import org.jivesoftware.smack.AbstractXMPPConnection;import org.jivesoftware.smack.ConnectionConfiguration.SecurityMode;import org.jivesoftware.smack.chat. 查看详情

java示例代码_Smack+openfire-是否可以检查当前用户是否为管理员?/如何查看当前用户详细信息

java示例代码_Smack+openfire-是否可以检查当前用户是否为管理员?/如何查看当前用户详细信息 查看详情

在smack中阻止用户[关闭]

...序,我想从我的聊天列表中阻止特定的朋友。谁能告诉我如何通过smack库阻止特定用户。提前致谢。【问题讨论】:【参考方案1】:XMPP在XEP-16中定义隐私列表。Smack将XEP-16实现为PrivacyListManager。文档和示例代码可以在h 查看详情

gRPC Java 客户端能否通过长期存在的 gRPC 流并行发送多个请求以及如何管理 N 个流

...va客户端能否通过长期存在的gRPC流并行发送多个请求以及如何管理N个流【英文标题】:CangRPCJavaclientsendmultiplerequestsinparalleloveralonglivedgRPCstreamandhowtomanageNstreams【发布时间】:2021-11-1116:44:46【问题描述】:我正在使用“流式RPC”AP... 查看详情

在 Android Studio 上使用 Smack 构建 XML 流消息

...【发布时间】:2016-07-0320:34:27【问题描述】:我正在尝试通过Smack库验证我与Firebase-Cloud-Messaging的连接。我看到我的连接从google获得了一个streamId,因为我在我的AndroidStudioIDE上记录了这条 查看详情

如何在 Flutter 中管理对象列表流?

】如何在Flutter中管理对象列表流?【英文标题】:HowtomanageastreamofListofobjectsinFlutter?【发布时间】:2019-09-3007:58:14【问题描述】:我这几天一直在研究Flutter,我正在尝试制作一个简单的ToDo应用,作为一个学习项目。我正在尝试... 查看详情

如何使用 smack 和 java 从 jid 到 jid?

】如何使用smack和java从jid到jid?【英文标题】:howtogetfromjid&tojidusingsmackandjava?【发布时间】:2014-05-0304:44:27【问题描述】:通过使用下面的代码,我只能从userId获取,但不能从userId获取。publicvoidprocessMessage(Chatchat,Messagemessage)i... 查看详情

使用 EJABBERD-BUSINESS 版本在 SMACK 中恢复流后读取“重新绑定”数据包

】使用EJABBERD-BUSINESS版本在SMACK中恢复流后读取“重新绑定”数据包【英文标题】:Read\'Rebind\'PacketafterstreamresumptioninSMACKwithEJABBERD-BUSINESSEdition【发布时间】:2016-03-1015:10:15【问题描述】:我想阅读我发送到ejabberd-business版本服务... 查看详情

如何在 java 中使用 Smack XMPP 库处理 TLS 证书

】如何在java中使用SmackXMPP库处理TLS证书【英文标题】:HowtohandleTLScertificateusingSmackXMPPlibraryinjava【发布时间】:2011-04-1821:51:47【问题描述】:大家好。我刚刚开始在Java中使用XMPP,包括服务器端和客户端。在服务器端,我使用的... 查看详情

Smack 在 Java EE 中运行良好吗

...】:Smack在JavaEE中是否正常运行?我遇到了存在问题。我通过doPost方法从登录表单中获取凭据..我可以成功地进行身份验证以及connection.getRoster()也可以工作。接下来我只想显示在线的用户,这样当我得到用户的存在时,存在对象... 查看详情

java多线程通过管道流实现不同线程之间的通信

...数据到输出管道,另外一个线程从输入管道中读取数据。通过使用管道,实现不同线程间的通信,而不必借助类似临时文件之类的东西。jdk提供4个类来使线程建可以进行通信。(1)PipedInputStream与PipedOutputStream(2)PipedReader与PipedWriter&... 查看详情

如何使用 smack Java 获取 IQ 标签?

】如何使用smackJava获取IQ标签?【英文标题】:HowtogetIQtagusingsmackJava?【发布时间】:2012-03-1814:48:50【问题描述】:实际上,问题是当我的xmpp客户端发送朋友邀请,然后收件人已经批准邀请时,openfire服务器再次向发起者/邀请发... 查看详情

如何在 smack 中实现消息确认

】如何在smack中实现消息确认【英文标题】:HowtoimplementmessageAcknowledgementinsmack【发布时间】:2017-02-1505:06:34【问题描述】:我已经在我的android应用程序中成功实现了一对一聊天。现在我想知道我的消息是否已送达。我用谷歌搜... 查看详情

如何在 smack 中向 chatmanager 添加多个聊天?

】如何在smack中向chatmanager添加多个聊天?【英文标题】:Howtoaddmultiplechatstochatmanagerinsmack?【发布时间】:2014-05-0506:08:57【问题描述】:来自smack文档:聊天管理器跟踪对所有当前聊天的引用。它自己不会在内存中保存任何引用,... 查看详情

使用 Smack 删除帐户

...singSmack【发布时间】:2015-07-1907:35:20【问题描述】:我想通过Smack删除帐户。有method可以从服务器中删除当前登录的账号。但是当我使用管理员帐户登录时,我需要删除另一个帐户。我可以创建帐户:accountManager.createAccount(username... 查看详情

无法在 JAVA 中使用 SMACK api 显示收到的消息

...有一个发送按钮向用户Y发送消息。我已经检查了XMPP调试管理器, 查看详情

使用 smack 库的 android 头像管理

【中文标题】使用smack库的android头像管理【英文标题】:Avatarmanagementusingsmacklibraryforandroid【发布时间】:2015-10-1306:35:32【问题描述】:谁能告诉我在Android中使用Smack库进行头像管理的最佳方式?【问题讨论】:【参考方案1】:... 查看详情

java多线程-管道流实现线程间通信(代码片段)

...据到输出管道流,另一个线程从输入管道流中读取数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。字节流PipedInputStream和PipedOutputStream字符流PipedReader和Pip 查看详情