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自动更新,也花了我将近一个礼拜啊,现在想想是很有意义的。现在想得起就这么多,以后记起再补充。

 

posted @ 2013-04-10 15:55  clunyes  阅读(2636)  评论(0编辑  收藏  举报