<< 2008년 5월 31일 (토) | | 2008년 6월 2일 (월) >>

Gtalk Chat 구현 하기

Smack.jar이라는  Java XMPP client library를 가지고 Google Talk Client 어플리케이션을 개발할 수 있습니다. 웹 채팅 인터페이스를 만들수도 있죠.
아래는 응용한 소스를 공유합니다.

1. 응용 소스
package com.mimul.common.util;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.PacketCollector;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.RosterListener;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.PacketFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Packet;
import org.jivesoftware.smack.packet.Presence;

public class GtalkClient
{
public List<RosterEntry> getOnlineEntries(XMPPConnection connection){
List<RosterEntry> onlineEntries = new ArrayList<RosterEntry>();
Roster roster = connection.getRoster();
roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all);
List<RosterEntry> entries = new ArrayList<RosterEntry>();
entries.addAll(roster.getEntries());
for (RosterEntry entry:entries) {
if(roster.getPresence(entry.getUser()).getType() ==
Presence.Type.available) {
onlineEntries.add(entry);
}
}
return onlineEntries;
}

public static void main(String[] args) {
GtalkClient gtalk = new GtalkClient();
ConnectionConfiguration connConfig =
new ConnectionConfiguration("talk.google.com",
5222, "gmail.com");
XMPPConnection connection = new XMPPConnection(connConfig);
try {
connection.connect();
System.out.println("Connected to " + connection.getHost());
} catch (XMPPException ex) {
System.out.println("Failed to connect to " +
connection.getHost());
System.exit(1);
}
try {
connection.login("hahojin", "password");
System.out.println("Logged in as " + connection.getUser());
Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
Roster roster = connection.getRoster();
PacketFilter myFilter = new PacketFilter() {
public boolean accept(Packet packet) {
return true;
}
};

PacketCollector collector =
connection.createPacketCollector(myFilter);
roster.addRosterListener(new RosterListener(){
public void entriesAdded(Collection<String> addresses) {

}
public void entriesDeleted(Collection<String> addresses) {
// TODO Auto-generated method stub
}

public void entriesUpdated(Collection<String> addresses) {
// TODO Auto-generated method stub
}
public void presenceChanged(Presence presence) {

}});
while(true) {
Packet packet = collector.nextResult();
if(packet instanceof Message) {
Message msg = (Message) packet;
for (RosterEntry e:gtalk.getOnlineEntries(connection)) {
if (StringUtils.isNotBlank(msg.getFrom()) &&
msg.getFrom().indexOf(e.getUser())!=-1) {
continue;
}
System.out.println("online user:" + e.getUser());
Chat chat = connection.getChatManager().createChat(
e.getUser(), new MessageListener(){
public void processMessage(Chat chat,
Message message) {
//chat.sendMessage("got it.");
}});
chat.sendMessage(msg.getFrom() + ":" +
msg.getBody());
}
}
}
} catch (XMPPException ex) {
System.out.println("Failed to log in as " +
connection.getUser());
System.exit(1);
}
System.out.println("Press enter to disconnect");
try {
System.in.read();
} catch (IOException ex) {
}
connection.disconnect();
}
}

2. 참조 문서
 - http://www.igniterealtime.org/builds/smack/docs/latest/documentation/
태그 :