본문 바로가기

개발/안드로이드 개발

XMPP 관련 SmackAPI정보

출처 : http://devroid.com/80130736119

- 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 버전이 최신인지는 잘 모르겠네요.


asmack-2010.05.07.jar.zip


[출처] SmackAPI 간단 정리|작성자 김기용