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