Openfire Smack 기반 인스턴트 메시징 어플리케이션 개발, 오프라인 메시지 얻기, 메시지 보내기, 연락처 목록, 친구 추가(3)

1: 앞의 두 편에서 Openfire 서버의 구축과 등록 로그인을 말했는데 다음은 중점이다. 친구와 채팅을 실현하는 것이다.


2: 사용자의 모든 친구 얻기

XMPPTCPConnection connection
    /** *   */
    public Roster getContact() {
        Roster roster = Roster.getInstanceFor(connection);
        // 
        Collection<RosterGroup> groups = roster.getGroups();
        for (RosterGroup group : groups) {
            // 
            List<RosterEntry> entries = group.getEntries();
            for (RosterEntry entry : entries) {
                // 
                entry.getUser();
                entry.getName();
                entry.getType();
                entry.getStatus();
            }
        }
        return roster;
    }

3: Smack은 역사적인 채팅 기록을 얻는api(본인은 줄곧 찾지 못했기 때문에) 채팅 기록, 채팅 목록 부분에 대해 자신이 데이터베이스를 설계하여 채팅 정보를 저장해야 한다.여기서 중점적인 Api 방법을 정리할게요.

  • 사용자가 오프라인 메시지를 받으려면 XMPTPTCPConnection을 가져올 때 로그인 상태를 오프라인 상태로 설정해야 합니다. 그렇지 않으면 얻을 수 없습니다
  • XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()
                            //....
                            // 
                            .setSendPresence(false)
                             //....
                 XMPPTCPConnection  connection = new XMPPTCPConnection(config);
  • 오프라인 메시지 얻기
  •     /** *   *   */
        private void getOfflineMessage() {
            OfflineMessageManager offlineManager = new OfflineMessageManager(connection);
            try {
                List<Message> list = offlineManager.getMessages();
                // 
                offlineManager.deleteMessages();
                // 
                Presence presence = new Presence(Presence.Type.available);
                connection.sendStanza(presence);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    4: 이전에 설치한 스파크를 사용하여 테스트를 할 수 있다는 메시지를 보냅니다.

     try {
                ChatManager manager =  ChatManager.getInstanceFor(connection);
                Chat chat =  manager.createChat("[email protected]",null);
                chat.sendMessage("HelloWord");
            } catch (SmackException.NotConnectedException e) {
                e.printStackTrace();
            }

    manager.createChat(userJID, null); userJID는 사용자 이름 @ 서버 IP 주소여야 합니다. 그렇지 않으면 메시지를 보낼 수 없습니다.

    5:기왕 메시지를 보낼 수 있다면 당연히 상대방이 당신에게 보낸 메시지를 얻을 수 있습니다.

        /** *   */
        public void initListener() {
            ChatManager manager = ChatManager.getInstanceFor(connection);
            // 
            final ChatMessageListener messageListener = new ChatMessageListener() {
                @Override
                public void processMessage(Chat chat, Message message) {
                    // , 
                    if (!TextUtils.isEmpty(message.getBody())) {
                        //message 
                    }
                }
            };
            ChatManagerListener chatManagerListener = new ChatManagerListener() {
    
                @Override
                public void chatCreated(Chat chat, boolean arg1) {
                    chat.addMessageListener(messageListener);
                }
            };
            manager.addChatListener(chatManagerListener);
        }

    6: 친구와 친구 추가 감청 요청

        /** *   * * @param user  * @param nickName   * @param groupName   */
        Roster.getInstanceFor(connection).createEntry("[email protected]", "", null);
    
    
        /** *   */
        public void addFriendListener() {
            // 
            StanzaFilter filter = new AndFilter();
            StanzaListener listener = new StanzaListener() {
                @Override
                public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
                    DiscoverInfo p = (DiscoverInfo) packet;
                    //p 
                    if (p.getType().toString().equals("subscrib")) {
                        // 
                    } else if (p.getType().toString().equals("subscribed")) {
                        // 
                    } else if (p.getType().toString().equals("unsubscribe")) {
                        // 
                    }
                }
            };
            connection.addAsyncStanzaListener(listener, filter);
        }

    다음은 본인이 실현한 대략적인 채팅 인터페이스로 겨우 하나의 채팅 기능을 실현했다.

    좋은 웹페이지 즐겨찾기