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 옵션을 넣음

2013년 3월 31일 일요일

Sqlite3 JDBC 사용

다운로드 받기:  https://bitbucket.org/xerial/sqlite-jdbc/downloads

라이브러리 추가:
- classpath 에 sqlite-jdbc-(VERSION).jar 파일을 추가한다.
- JSP 서버에서 사용하려면 WEB-INF/lib/ 폴더에 복사한다.

사용법
 - 기본 연결:
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:sample.db");

그러면 파일 실행 위치나 서버 실행 위치에 sample.db  라는 파일이 생성된다.
파일 생성 위치를 변경하기 위해 절대경로를 넣을 수도 있다.
예)
jdbc:sqlite:c:/sample/sample.db

나머지는 표준 JDBC 사용법과 같다.


2012년 11월 12일 월요일

String split() 사용

1. 일반적으로 생각하는 split() 함수 사용

 > 아래와 같이 String 을 split() 함수를 이용해 나눌 수 있다.

String line = "a,b,c,d,e,f";
String[] result = line.split(",");

결과:
result ==> [a, b, c, d, e, f]


2. delimiter 사이에 빈 문자 처리

 > 아래와 같은 경우 빈 string 도 결과 배열에 포함한다.

String line = "a,,c,d,e,f";
String[] result = line.split(",");

결과:
result ==> [a, , c, d, e, f]

 > 아래와 같은 경우 빈 string 을 결과 배열에 포함하지 않는다.

String line = "a,,c,d,e,f";
String[] result = line.split("(,+)");

결과:
result ==> [a, c, d, e, f]

설명:
정규 표현 (,+) 의 의미는 , 이 하나 이상을 표현한다.
결국 연달아 , 이 반복되는 경우 하나의 delimiter 로 인식한다.

Regex 참고: http://moonlighting.tistory.com/52