- 샘플 코드 참고 : 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 옵션을 넣음
댓글 없음:
댓글 쓰기