-
1. 修改自身状态
包括上线,隐身,对某人隐身,对某人上线
- public static void updateStateToAvailable(XMPPConnection connection)
- {
- Presence presence = new Presence(Presence.Type.available);
- connection.sendPacket(presence);
- }
- public static void updateStateToUnAvailable(XMPPConnection connection)
- {
- Presence presence = new Presence(Presence.Type.unavailable);
- connection.sendPacket(presence);
- }
- public static void updateStateToUnAvailableToSomeone(XMPPConnection connection,String userName)
- {
- Presence presence = new Presence(Presence.Type.unavailable);
- presence.setTo(userName);
- connection.sendPacket(presence);
- }
- public static void updateStateToAvailableToSomeone(XMPPConnection connection,String userName)
- {
- Presence presence = new Presence(Presence.Type.available);
- presence.setTo(userName);
- connection.sendPacket(presence);
- }
- /**
- * 修改心情
- * @param connection
- * @param status
- */
- public static void changeStateMessage(XMPPConnection connection,String status)
- {
- Presence presence = new Presence(Presence.Type.available);
- presence.setStatus(status);
- connection.sendPacket(presence);
- }
3. 修改用户头像
有点麻烦,主要是读入图片文件,编码,传输之
- public static void changeImage(XMPPConnection connection,File f) throws XMPPException, IOException
- {
- VCard vcard = new VCard();
- vcard.load(connection);
- byte[] bytes;
- bytes = getFileBytes(f);
- String encodedImage = StringUtils.encodeBase64(bytes);
- vcard.setAvatar(bytes, encodedImage);
- vcard.setEncodedImage(encodedImage);
- vcard.setField("PHOTO", "<TYPE>image/jpg</TYPE><BINVAL>"
- + encodedImage + "</BINVAL>", true);
- ByteArrayInputStream bais = new ByteArrayInputStream(
- vcard.getAvatar());
- Image image = ImageIO.read(bais);
- ImageIcon ic = new ImageIcon(image);
- vcard.save(connection);
- }
- private static byte[] getFileBytes(File file) throws IOException {
- BufferedInputStream bis = null;
- try {
- bis = new BufferedInputStream(new FileInputStream(file));
- int bytes = (int) file.length();
- byte[] buffer = new byte[bytes];
- int readBytes = bis.read(buffer);
- if (readBytes != buffer.length) {
- throw new IOException("Entire file not read");
- }
- return buffer;
- } finally {
- if (bis != null) {
- bis.close();
- }
- }
- }
4. 补充,用户状态的监听
即对方改变头像,状态,心情时,更新自己用户列表,其实这里已经有smack实现的监听器
- final Roster roster = Client.getRoster();
- roster.addRosterListener(
- new RosterListener() {
- @Override
- public void entriesAdded(Collection<String> arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"entriesAdded");
- }
- @Override
- public void entriesDeleted(Collection<String> arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"entriesDeleted");
- }
- @Override
- public void entriesUpdated(Collection<String> arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"entriesUpdated");
- }
- @Override
- public void presenceChanged(Presence arg0) {
- // TODO Auto-generated method stub
- System.out.println("--------EE:"+"presenceChanged");
- }
- });
- 离线消息和离线文件
1. 文件的发送
开一个文件选择框,选中文件后再调用下面的方法
- public static void sendFile(XMPPConnection connection,
- String user, File file) throws XMPPException, InterruptedException {
- System.out.println("发送文件开始"+file.getName());
- FileTransferManager transfer = new FileTransferManager(Client.getConnection());
- System.out.println("发送文件给: "+user+Client.getServiceNameWithPre());
- OutgoingFileTransfer out = transfer.createOutgoingFileTransfer(user+Client.getServiceNameWithPre()+"/Smack");//
- out.sendFile(file, file.getName());
- System.out.println("//");
- System.out.println(out.getStatus());
- System.out.println(out.getProgress());
- System.out.println(out.isDone());
- System.out.println("//");
- System.out.println("发送文件结束");
- }
2. 文件接收,必须使用监听
- FileTransferManager transfer = new FileTransferManager(connection);
- transfer.addFileTransferListener(new RecFileTransferListener());
- public class RecFileTransferListener implements FileTransferListener {
- public String getFileType(String fileFullName)
- {
- if(fileFullName.contains("."))
- {
- return "."+fileFullName.split("//.")[1];
- }else{
- return fileFullName;
- }
- }
- @Override
- public void fileTransferRequest(FileTransferRequest request) {
- System.out.println("接收文件开始.....");
- final IncomingFileTransfer inTransfer = request.accept();
- final String fileName = request.getFileName();
- long length = request.getFileSize();
- final String fromUser = request.getRequestor().split("/")[0];
- System.out.println("文件大小:"+length + " "+request.getRequestor());
- System.out.println(""+request.getMimeType());
- try {
- JFileChooser chooser = new JFileChooser();
- chooser.setCurrentDirectory(new File("."));
- int result = chooser.showOpenDialog(null);
- if(result==JFileChooser.APPROVE_OPTION)
- {
- final File file = chooser.getSelectedFile();
- System.out.println(file.getAbsolutePath());
- new Thread(){
- public void run()
- {
- try {
- System.out.println("接受文件: " + fileName);
- inTransfer
- .recieveFile(new File(file
- .getAbsolutePath()
- + getFileType(fileName)));
- Message message = new Message();
- message.setFrom(fromUser);
- message.setProperty("REC_SIGN", "SUCCESS");
- message.setBody("["+fromUser+"]发送文件: "+fileName+"/r/n"+"存储位置: "+file.getAbsolutePath()+ getFileType(fileName));
- if (Client.isChatExist(fromUser)) {
- Client.getChatRoom(fromUser).messageReceiveHandler(
- message);
- } else {
- ChatFrameThread cft = new ChatFrameThread(
- fromUser, message);
- cft.start();
- }
- } catch (Exception e2) {
- e2.printStackTrace();
- }
- }
- }.start();
- }else{
- System.out.println("拒绝接受文件: "+fileName);
- request.reject();
- Message message = new Message();
- message.setFrom(fromUser);
- message.setBody("拒绝"+fromUser+"发送文件: "+fileName);
- message.setProperty("REC_SIGN", "REJECT");
- if (Client.isChatExist(fromUser)) {
- Client.getChatRoom(fromUser)
- .messageReceiveHandler(message);
- } else {
- ChatFrameThread cft = new ChatFrameThread(
- fromUser, message);
- cft.start();
- }
- }
- /* InputStream in = inTransfer.recieveFile();
- String fileName = "r"+inTransfer.getFileName();
- OutputStream out = new FileOutputStream(new File("d:/receive/"+fileName));
- byte[] b = new byte[512];
- while(in.read(b) != -1)
- {
- out.write(b);
- out.flush();
- }
- in.close();
- out.close();*/
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("接收文件结束.....");
- }
- }