* Smack library로 sample chat을 실행 해 봄.
* Server는 OpenFire 설치 후 계정 설정 후 테스트
* Android상에서 테스트 하려면 아래의 경로의 asmack.jar를 사용해야 한다.
* XMPP의 id는 email과 비슷하다는 것을 꼭 유념하고 상대 id에 domain이 포함되도록 해야한다.
포함되지 않으면 메세지 전송 시 remote server not found (404) error를 리턴한다.
Smack library의 simple sample은 아래에서 보여주고 있음.
// Create a connection to the igniterealtime.org XMPP server. Connection con = new XMPPConnection("igniterealtime.org");
// Connect to the server con.connect(); // Most servers require you to login before performing other tasks. con.login("jsmith", "mypass"); // Start a new conversation with John Doe and send him a message. Chat chat = connection.getChatManager().createChat("jdoe@igniterealtime.org", new MessageListener() { |
XMPP기반 서버에 연결하기 위해 XMPPConnection을 사용하여 host name을 명시하고 connect하는 코드
혹시 IP, port base로 연결을 위해서는 ConnectionConfiguration을 사용해야 함.
// Create a connection to the igniterealtime.org XMPP server.
Connection con = new XMPPConnection("igniterealtime.org");
// Connect to the server
con.connect();
|
서버에서 Authentication이 필요하다면 계정 정보를 입력
// Most servers require you to login before performing other tasks.
con.login("jsmith", "mypass");
|
1:1 chatting에서는 상대방 계정(jdoe@igniterealtime.org)을 명시 필요.
Group chatting을 위해서는 MultiUserChat을 사용해야 함.. 관련 내용은 아래 링크를 참고
(MultiUserChat 다다: http://www.igniterealtime.org/builds/smack/docs/latest/documentation/extensions/muc.html)
// Start a new conversation with John Doe and send him a message.
Chat chat = connection.getChatManager().createChat("jdoe@igniterealtime.org", new MessageListener() { |
Message는 다음과 같은 Type을 가지고 각 Type별 mandatory, optional field는 다음과 같다.
Represents XMPP message packets. A message can be one of several types:
|
뭐 message를 전달하고 connection을 close하는 코드...
chat.sendMessage("Howdy!");
// Disconnect from the server
con.disconnect(); |
사실 상 XMPP spec를 모르는 상태에서도 library를 사용하는데는 별 무리가 없을 정도로 쉽고 일관적이다.
Documentation이나 web 상에서 관련 질문이나 답변도 쉽게 찾을 수 있고..
아래는 작성해서 테스트 해본 샘플 코드...
Smack library에서 제공하는 것과 별 차이 없다.
* 다만 OpenFire의 default port는 5222
ChatRoom c1 = new ChatRoom("localhost", 5222);
c1.setAuthInfo("h@c-portable", "1234");
c1.talkWith("c@c-portable", new MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.print("h is received message => ");
if(message.getSubject() != null)
{
System.out.println(message.getSubject() + " : ");
}
System.out.println(message.getBody());
}
});
ChatRoom c2 = new ChatRoom("localhost", 5222);
c2.setAuthInfo("c@c-portable", "1234");
c2.talkWith("h@c-portable", new MessageListener() {
public void processMessage(Chat chat, Message message) {
System.out.print("c is received message => ");
if(message.getSubject() != null)
{
System.out.println(message.getSubject() + " : ");
}
System.out.println(message.getBody());
}
});
class ChatRoom {
private Connection connection;
private Chat chat;
private String accountID;
private String accountPW;
ChatRoom(String host, int port) {
connection = new XMPPConnection(new ConnectionConfiguration(host, port));
}
void setAuthInfo(String id, String pw) {
accountID = id;
accountPW = pw;
}
void talkWith(String NameOfPersonTalkWith, MessageListener messageListener) {
try {
connection.connect();
connection.login(accountID, accountPW);
chat = connection.getChatManager().createChat(NameOfPersonTalkWith,
messageListener);
chat.sendMessage("Entered!");
} catch (XMPPException e) {
e.printStackTrace();
}
}
void send(String msg) {
if (chat != null) {
try {
chat.sendMessage(msg);
} catch (XMPPException e) {
e.printStackTrace();
}과
}
}
void close() {
connection.disconnect();
}
}
|
실행 결과
h is received message => Entered!
c is received message => Entered!
h is received message => msg send 2
c is received message => msg send 3
h is received message => msg send 4
c is received message => msg send 5
h is received message => msg send 6
c is received message => msg send 7
h is received message => msg send 8
c is received message => msg send 9
h is received message => msg send 10
|
댓글 없음:
댓글 쓰기