2013년 4월 5일 금요일

[XMPP] Smack + Google Talk 예제

참고
 - 샘플 코드 참고 : http://sensorapp.net/?p=85
 - 콘솔창에서 비밀번호 입력 : http://stackoverflow.com/questions/8138411/masking-password-input-from-the-console-java
 - UTF-8 컴파일 문제 : http://mwultong.blogspot.com/2006/09/java-utf-8-utf-16-unicode.html

다운로드
 - 링크: http://www.igniterealtime.org/downloads/index.jsp
 - Smack 3.2.2 를 다운 받았다.

필요한 파일
 - 실제 실행하는데에 smackx.jar 파일 하나면 충분했다.

예제 코드
 - 아래와 같은 작업을 한다.
1. 로그인
2. 대화 상대 목록 표시
3. 대화 상대 선택
4. 대화
package xmpp.smack;

import java.io.BufferedReader;
import java.io.Console;
import java.io.InputStreamReader;
import java.util.Iterator;

import javax.net.ssl.SSLContext;

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.packet.Message;

/**
 * 참고: http://sensorapp.net/?p=85
 */
public class GtalkTest {
 public static void main(String[] args) throws Exception {
  GtalkTest gt = new GtalkTest();
  gt.test();
 }
 
 public void test() throws Exception {
  
  boolean 인증필요 = false;
  
  ConnectionConfiguration config = null;
  if (인증필요) {
   config = new ConnectionConfiguration("talk.google.com", 5223, "gmail.com");
   SSLContext context = SSLContext.getInstance("TLS");
   context.init(null, null, null);
   config.setSocketFactory(context.getSocketFactory());
  } else {
   config = new ConnectionConfiguration("talk.google.com", 5222, "gmail.com");
  }
  
  
  XMPPConnection conn = new XMPPConnection(config);
  
  conn.connect();
  
  BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
  
  System.out.print("아이디(@gmail.com 자동 첨부) : ");
  String username = reader.readLine();
  if (!username.endsWith("@gmail.com")) {
   username += "@gmail.com";
  }
  
  Console console = System.console();
  String password = "";
  if (console == null) {
   System.out.print("비밀번호 : ");
   password = reader.readLine();
  } else {
   password = new String(console.readPassword("비밀번호: "));
  }
  
  
  conn.login(username, password);
  
  System.out.println("{친구 목록}");
  Iterator<RosterEntry> entries = conn.getRoster().getEntries().iterator();
  while (entries.hasNext()) {
   RosterEntry e = entries.next();
   System.out.printf(" - %s\n", e.getUser());
  }
  
  System.out.println("{대화 상대 선택}");
  String target = reader.readLine();
  
  MessageListener listener = new MessageListener() {
   @Override
   public void processMessage(Chat chat, Message message) {
    if (message.getType() == Message.Type.chat && message.getBody() != null) {
     System.out.printf("%s : %s\n", chat.getParticipant(), message.getBody());
    }
   }
  };
  
  Chat chat = conn.getChatManager().createChat(target, listener);
  
  System.out.println("{대화 시작}");
  
  String msg = null;
  while (!(msg = reader.readLine()).equals("!종료")) {
   chat.sendMessage(msg);
  }
  
  conn.disconnect();
  
  System.out.println("{종료합니다}");
 }
}
컴파일 및 실행
 - 실행은 IDE 말고 콘솔 창에서 하는게 낫다. (한글 입력 문제나 비밀번호 입력시 모두 노출되는 문제 때문)
예)
C:\> javac -encoding utf-8 -cp .;libs\smackx.jar src\xmpp\smack\GtalkTest.java

C:\> java -cp .;libs\smackx.jar;src xmpp.smack.GtalkTest
아이디(@gmail.com 자동 첨부) : username
비밀번호:
{친구 목록}
 - friend@gmail.com
{대화 상대 선택}
friend@gmail.com
{대화 시작}
test
!종료
{종료합니다}
한글 문제 때문에 javac 에 utf-8 옵션을 넣음

댓글 없음:

댓글 쓰기