- XMPP 서버와의 연결
Connection conn = new XMPPConnection("서버");
conn.connect();
- 특정 포트를 통한 연결
ConnectionConfiguration config = new ConnectionConfiguration("서버", 포트);
Connection conn = new XMPPConnection(config);
conn.connect();
* 연결한 다음 로그인시 try로 잡히지도 않는 오류가 발생할 수가 있다. 그때는 옵션을 조절해본다.
ConnectionConfiguration config = new ConnectionConfiguration("서버", 포트);
config.setCompressionEnabled(true);
config.setSASLAuthenticationEnabled(true);
Connection conn = new XMPPConnection(config);
conn.connect();
- 로그인
conn.login("아이디", "비밀번호");
- 나의 Presence 정보를 변경
Presence presence = new Presence( Presence.Type.unavailable );
presence.setStatus("상태설명");
conn.sendPacket(presence);
- 갑작스런 접속해제시 재접속 여부 설정 ( 접속이 끊어지면 자동으로 재접속을 시도 )
ConnectionConfiguration config = new ConnectionConfiguration("서버", 포트);
config.setReconnectionAllowed(boolean);
- 대화 ( Chat 객체는 두 사용자간에 새로운 스레드를 만들게 된다. )
ChatManager chatmanager = conn.getChatManager();
Chat newChat = chatmanager.createChat("대화상대ID", new MessageListener() {
public void processMessage(Chat chat, Message message) {
// chat : 대화상대객체 , message : 수신메시지객체
}
} );
try {
newChat.sendMessage("보내는 메시지");
} catch( XMPPException e ) {
// 예외처리
}
- 한번 대화를 나눈 상대라면 기존에 대화하던 스레드가 있다면 그것을 이용한다.
ChatManager chatmanager = conn.getChatManager().addChatListener(
new ChatManagerListener() {
@Override
public void chatCreated(Chat chat, boolean createdLocally) {
if ( !createdLocally ) chat.addMessageListener( new NewMessageListener() );
}
} );
- Roster 객체 구하기
Roster roster = conn.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries ) {
// entry 객체 사용
}
- 특정 user의 Presence 구하기 ( 해당 user가 오프라인이거나 상태를 보여주기를 거부한 user라면 null이 반환 )
Precense precense = roster.getPresence("사용자ID");
- Roster 변경 감지
Roster roster = conn.getRoster();
roster.addRosterListener( new RosterListener() {
public void entriesDeleted(Collection<String> address) {}
public void entriesUpdated(Collection<String> address) {}
public void presenceChanged(Presence presence) {
// presence 객체로 변경내용 통지
}
} );
- 누군가가 자신의 Presence를 요청했을때 자동으로 수락할지, 자동으로 거절할지, 수동으로 결정할지 이렇게 세가지 방식이 있는데 다음과 같이 설정한다.
roster.setSubscriptionMode(Roster.SubscriptionMode);
( 수동으로 결정한다고 한 경우에는 Presence.Type.subscribe 타입을 가진 Presence 패킷을 위한 PacketListener가 등록되어 있어야 한다. 그 이벤트헨들러로 요청정보가 배달되며 거기서 결정하는 것이다. )
- 패킷 수신
패킷수신은 두가지 방식이 있다. 동기적인 방식과 비동기적인 방식.
org.jivesoftware.smack.PacketCollector 는 동기적인 방식.
org.jivesoftware.smack.PacketListener 는 비동기적인 방식.
- 패킷 수신시 필터 지정
org.jivesoftware.smack.filter.PacketFilter 인터페이스는 PacketCollector나 PacketListener로 배달되는 패킷을 필터링 할수가 있다.
PacketFilter filter = new AndFilter( new PacketTypeFiulter(Message.class), new FromContainsFilter(test@openfire.co.kr) ); // test@openfire.co.kr 사용자로부터 오는 메시지 패킷만을 받겠다고 지정
PacketCollector collector = conn.createPacketCollector(filter); // 위에서 지정된 필터로 PacketCollector를 제한한다.
PacketListener listener = new PacketListener() {
public void processPacket( Packet packet ) {
// 수신된 패킷 처리
}
}
conn.addPacketListener( listener, filter ); // 위에서 지정된 필터로 PacketListener를 제한한다.
- 표준 패킷 필터 ( 미리 정의된 패킷필터 )
PacketTypeFilter => 지정된 타입의 클래스를 위한 필터
PacketIDFilter => 지정된 패킷ID를 가진 패킷을 위한 필터
ThreadFilter => 지정된 스레드ID를 가진 메시지패킷을 위한 필터
ToContainsFilter => 지정된 주소로 보내지는 패킷을 위한 필터
FromContainsFilter => 지정된 주소로부터 오는 패킷을 위한 필터
PacketExtensionFilter => 지정된 패킷확장을 가진 패킷을 위한 필터
AndFilter => 두개의 필터의 AND 연산
OrFilter => 두개의 필터의 OR 연산
NotFilter => 지정된 필터의 NOT 연산
참고로 asmac api입니다. 2010.5.7 버전이 최신인지는 잘 모르겠네요.
[출처] SmackAPI 간단 정리|작성자 김기용
'개발 > 안드로이드 개발' 카테고리의 다른 글
Facebook 쪽지보내기(Chat api)관련 (2) | 2012.12.13 |
---|---|
android send SMS (2) | 2012.12.11 |
[안드로이드]ListView.CHOICE_MODE_SINGLE,CHOICE_MODE_MULTIPLE (0) | 2012.10.15 |
[안드로이드]Chronometer 사용하기 - 타이머 (0) | 2012.10.11 |
[안드로이드]파일 연결 - Intent setDataAndType(Uri , MimeType) (3) | 2012.09.06 |