• openfire+asmack


         虽然说自己在openfire和asmack上面花的时间不是特别多,但是好歹做过一阵子,现在回头一看,好多都不记得。

         有必要记一笔。

         我认为要开发asmack,下载openfire服务端和spark客户端是必不可少的,你可以从这两个开源项目中,知道你能够开发出什么效果。Beem我也下载来用过,不太好用。

         1.在asmack上做的第一个功能是创建账户

          connectionConfig = new ConnectionConfiguration(xmppserver,
                        Integer.parseInt(xmppport));
                connectionConfig.setSASLAuthenticationEnabled(false);
                connection = new XMPPConnection(connectionConfig);

          AccountManager manager = new AccountManager(connection);
                manager.createAccount(myApp.getUsername(), myApp.getUserpassword());

    这个功能比较简单,没有难度。

    2.其次是聊天室收发消息

               此功能也极为简单,后来这块废弃不用了,我也就忘记了,只知道大致就需要进入MultiUserChat,加上监听就行了。

               MultiUserChat chat = new MultiUserChat(connection, "zk@xiaokangkang-pc/Spark 2.6.3 ");

        chat.join("Mr zk");//昵称进入聊天室
                chat.addMessageListener(new PacketListener() {
                    
                    @Override
                    public void processPacket(Packet arg0) {
                        // TODO Auto-generated method stub
                        
                    }
                });

           3. 接下来的就是接收信息的功能和多人聊天室没有差别:

           PacketListener listener = new PacketListener() {

                    @Override
                    public void processPacket(Packet packet) {
                        Message msg = (Message) packet;
                        // 存下来的数据
                        String result = msg.getBody();
                        myApp.setMessage(result);
                        Intent intent = new Intent();
                        intent.setAction("GET_MESSAGE");
                        MessageService.this.sendBroadcast(intent);
                    }
                };
                connection.addPacketListener(listener, null);

         4.最有难度的要数传文件:(网上所说的离线文件传输,我没能实现,网上说的方法我都不是很认可,我觉得实现这个功能,自己做一个openfire的插件比较可行,通过修改asmack包来实现,我不认为能行)

         // 接收文件
        public void receiveFile() {
            FileTransferManager manager = new FileTransferManager(connection);
            manager.addFileTransferListener(new RecFileTransferListener());
        }

        主要代码就是通过这个RecFileTransferListener来实现的,使用socks5 bytestream,不太清楚,是xmpp传输用的流吧,反正都是处理流

        public void fileTransferRequest(FileTransferRequest request) {
            Log.i("--", "接收文件开始.....");
            final IncomingFileTransfer inTransfer = request.accept();
            // final String fileName = request.getFileName();
            long length = request.getFileSize();
            Log.i("--", "文件大小:" + length + "  " + inTransfer.getFileSize());
            Log.i("--", "" + request.getMimeType());
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                        InputStream in = new BufferedInputStream(
                                inTransfer.recieveFile());
                        String fileName = inTransfer.getFileName();
                        File file = new File(Environment
                                .getExternalStorageDirectory().getAbsolutePath()
                                + "/" + "hy_ht_new/test/" + fileName);
                        OutputStream out = new FileOutputStream(file);
                        byte[] b = new byte[1024];
                        int temp = 0;
                        while ((temp = in.read(b)) != -1) {
                            out.write(b, 0, temp);
                            out.flush();
                        }
                        Log.i("--", "接收文件大小:" + file.length());
                        in.close();
                        out.close();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }).start();
        }

    5.当然接收的用到了,发送的我也去试了下,不算难:

    // 发送文件
        private void sendFile(String user, XMPPConnection connection) {
            FileTransferManager manager = new FileTransferManager(connection);
            final OutgoingFileTransfer outTransfer = manager
                    .createOutgoingFileTransfer(user);
            final long timeOut = 1000000;
            final long sleepMin = 3000;
            
            new Thread(new Runnable() {

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    try {
                        int rs = 0;
                        long spTime = 0;
                        File file = new File(Environment
                                .getExternalStorageDirectory().getAbsolutePath()
                                + "/" + "hy_ht_new/" + "MPolice_old.apk");
                        outTransfer.sendFile(file, "jjjj");
                        rs = outTransfer.getStatus().compareTo(
                                FileTransfer.Status.complete);
                        while (rs != 0) {
                            rs = outTransfer.getStatus().compareTo(
                                    FileTransfer.Status.complete);
                            spTime = spTime + sleepMin;
                            if (spTime > timeOut) {
                                return;
                            }
                            Thread.sleep(sleepMin);
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }).start();

        }

          对了,对于收发文件这个功能,官方的asmack包是不支持的,网上有支持的包,我也有,需要可以找我。clunyes@126.com  

          最烦人的要数,接收和发送文件,smack的资料网上比较多,但是很乱,问过smack大牛,大牛说你先去看spark源码。。我也去看了,看着看着我对于java.swing的东西倒是越来越熟络,是悲是喜?

           openfire源码我也有,但是不敢看,太牛了,openfire插件只用过broadcast,它自带的,要配置过,具体在哪里配置完全忘记了,broadcast插件可以实现离线消息接收(hoojo大神果断发了个openfire插件的开发博客,我得去看看---http://www.cnblogs.com/hoojo/archive/2013/03/07/2947502.html)!这几个asmack是我硬着头皮做的东西,可能非常菜,但是我很喜欢,都是自己一点一点看api和网上资料看来的,遇到问题网上也没人解答(因为asmack问题都很怪异)。写到这里,我非常开心,要知道刚拿到这个任务时,我很纠结。那时入职2个月,刚刚转正,只会写些activity啊什么的,突然要搞这个,应该说我是花费了全部的精力去做的,结果也是做出来了-------同时期,还有个任务,app自动更新,也花了我将近一个礼拜啊,现在想想是很有意义的。现在想得起就这么多,以后记起再补充。

  • 相关阅读:
    Jquery里live事件移除原因
    js委托事件-addEventListeners(冒泡方向)
    后端同同不肯给我算好的时间差给我,只好自己写了:
    js滚动到顶部底部代码
    浏览器地址栏运行HTML代码(谷歌)
    黑马vue---56-58、vue组件创建的三种方式
    黑马vue---46、vue使用过渡类名实现动画
    黑马vue---28、vue中全局过滤器的基本使用
    vue devtools无法使用
    红心点赞效果的实现
  • 原文地址:https://www.cnblogs.com/clunyes/p/3012524.html
Copyright © 2020-2023  润新知