JML实现控制台界面的MSN客户端(不支持离线发消息)
来源:互联网 发布:北京外国语网络教育 编辑:程序博客网 时间:2024/05/29 17:44
IM.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.sun.xml.internal.bind.v2.runtime.reflect.Accessor.SetterOnlyReflection;
import net.sf.jml.Email;
import net.sf.jml.MsnMessenger;
import net.sf.jml.MsnProtocol;
import net.sf.jml.MsnUserStatus;
import net.sf.jml.impl.MsnMessengerFactory;
/**
* BY 黄金 RY0821119@buaa
* 欢迎转载,请注明作者,谢谢!
*/
public class IM implements Runnable{
private MsnMessenger messenger;// msn
// msn
private String receiveMessage;
private String errorText;
private String serverName;
private String email;
private String password;
public void login(String serverName, String email, String password) {
// TODO Auto-generated method stub
String result = "";
this.serverName=serverName;
this.email=email;
this.password=password;
if (serverName.equals("") || email.equals("") || password.equals("")) {
result = "{/"type/":/"error/",/"body/":{/"reason/":/"参数servername、email、password都不能为空!/"}}";
System.out.println(result);
}
this.MSNLogin(email, password);
}
private void MSNLogin(String email, String password) {
MsnMessenger messenger = null;
messenger = MsnMessengerFactory.createMsnMessenger(email, password);// 创建MsnMessenger
messenger
.setSupportedProtocol(new MsnProtocol[] { MsnProtocol.MSNP12 });// 设置登录协议
messenger.getOwner().setInitStatus(MsnUserStatus.ONLINE);// 设置用户状态
messenger.addListener(new MsnListener(messenger));// 注册事件
messenger.login();// 登录
setMessenger(messenger);
}
public void logout() {
messenger.logout();
}
public void sendMessage(String emailTo,String content) {
String result = "";
if (serverName.equals("msn")) {
getMessenger().sendText(Email.parseStr(emailTo), content);
result = "{/"type/":/"sucsses/"}";
//System.out.println(result);
System.out.println("["+new SimpleDateFormat("MM-dd HH:mm").format(new Date())+"] "+"我对"+emailTo+ "说:"+content);
} else {
result = "{/"type/":/"error/",/"body/":{/"reason/":/"你还没有登入MSN!/"}}";
//System.out.println(result);
}
}
public void receiveMessage() {
if (serverName.equals("msn")) {
//String result = "{/"type/":/"sucsses/",/"body/":{/"text/":/""+ getReceiveMessage() + "/"}}";
setReceiveMessage(null);
//System.out.println(result);
} else {
//String result = "{/"type/":/"error/",/"body/":{/"reason/":/"对方还没有回复!/"}}";
//System.out.println(result);
}
}
public MsnMessenger getMessenger() {
return messenger;
}
public void setMessenger(MsnMessenger messenger) {
this.messenger = messenger;
}
public String getReceiveMessage() {
return receiveMessage;
}
public void setReceiveMessage(String receiveMessage) {
this.receiveMessage = receiveMessage;
}
public String getErrorText() {
return errorText;
}
public void setErrorText(String errorText) {
this.errorText = errorText;
}
public void run(){
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
}
String content = null;
String emailTo = null;
while(true){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String input=in.readLine();
String[] temp=input.split(":",2);
if(temp.length==2){
emailTo=temp[0];
content=temp[1];
}
if(temp.length==1){
if(emailTo!=null)
content=temp[0];
else
System.err.println("未指定联系人!");
}
}catch(IOException e){
}
this.sendMessage(emailTo,content);
Thread.yield();
}
}
public static void main(String[] args){
IM msn = new IM();
msn.login("msn", "********@hotmail.com", "********");
msn.run();
}
}
MsnListener.java
import java.text.SimpleDateFormat;
import java.util.Date;
import net.sf.jml.MsnContact;
import net.sf.jml.MsnList;
import net.sf.jml.MsnMessenger;
import net.sf.jml.MsnSwitchboard;
import net.sf.jml.event.MsnAdapter;
import net.sf.jml.impl.MsnContactImpl;
import net.sf.jml.message.MsnControlMessage;
import net.sf.jml.message.MsnDatacastMessage;
import net.sf.jml.message.MsnInstantMessage;
import net.sf.jml.message.MsnSystemMessage;
import net.sf.jml.message.MsnUnknownMessage;
/**
* BY 黄金 RY0821119@buaa
* 欢迎转载,请注明作者,谢谢!
*/
public class MsnListener extends MsnAdapter {
private MsnMessenger messenger = null;
private String user_id;
/** Creates a new instance of msntest */
public MsnListener(MsnMessenger messenger) {
this.messenger=messenger;
}
public MsnListener() {
}
// 打印信息
private static void msg(Object obj) {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
if (obj instanceof Throwable)
System.err.println("[" + sdf.format(new Date()) + "] " + obj);
else
System.out.println("[" + sdf.format(new Date()) + "] " + obj);
}
// 收到正常信息的时候发生
public void instantMessageReceived(MsnSwitchboard switchboard,
MsnInstantMessage message, MsnContact contact) {
msg(contact.getDisplayName() + "对我说:" + message.getContent());
// 如果聊天内容为exit,退出
// if (message.getContent().trim().equalsIgnoreCase("exit")) {
// msg(contact.getDisplayName() + "对我发出退出指令。");
// messenger.logout();
// //System.exit(0);
// }
// String email = messenger.getOwner().getEmail().getEmailAddress();
//
//System.out.println(email);
// if(IM.getReceiveMessage()!=null){
// String text = IM.getReceiveMessage()+"/r/n"+contact.getDisplayName() + "对我说:" + message.getContent();
// IM.setReceiveMessage(text);
// }
// else{
// IM.setReceiveMessage(contact.getDisplayName() + "对我说:" + message.getContent());
// }
}
// 收到系统信息的时候发生,登录时
public void systemMessageReceived(MsnMessenger messenger,
MsnSystemMessage message) {
// msg(messenger + " recv system message " + message);
}
// 当在联系人聊天窗口获得光标并按下第一个键时发生
public void controlMessageReceived(MsnSwitchboard switchboard,
MsnControlMessage message, MsnContact contact) {
msg(contact.getFriendlyName() + "正在输入文字。");
}
// 异常时发生
public void exceptionCaught(MsnMessenger messenger, Throwable throwable) {
//msg(messenger + throwable.toString());
msg(throwable);
//System.out.println(throwable);
//String email = messenger.getOwner().getEmail().getEmailAddress();
}
// 登录完成时发生
public void loginCompleted(MsnMessenger messenger) {
msg(messenger.getOwner().getDisplayName() + "登录成功!");
String email = messenger.getOwner().getEmail().getEmailAddress();
messenger.getOwner().setDisplayName("黄金");
}
public MsnMessenger getMessenger() {
return messenger;
}
public void setMessenger(MsnMessenger messenger) {
this.messenger = messenger;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
// 注销时发生
public void logout(MsnMessenger messenger) {
msg(messenger + " logout");
//String email = messenger.getOwner().getEmail().getEmailAddress();
}
// 收到系统广播信息时发生
public void datacastMessageReceived(MsnSwitchboard switchboard,
MsnDatacastMessage message, MsnContact friend) {
msg(switchboard + " recv datacast message " + message);
switchboard.sendMessage(message, false);
}
// 收到目前不能处理的信息时发生
public void unknownMessageReceived(MsnSwitchboard switchboard,
MsnUnknownMessage message, MsnContact friend) {
// msg(switchboard + " recv unknown message " + message);
}
public void contactListInitCompleted(MsnMessenger messenger) {
listContacts();
}
/** */
/**
* 更新好友列表完成时发生
*/
// public void contactListSyncCompleted(MsnMessenger messenger) {
// listContacts();
// }
/** */
/**
* 关闭一个聊天窗口时发生
*/
public void switchboardClosed(MsnSwitchboard switchboard) {
//msg("switchboardEnded " + switchboard);
}
/** */
/**
* 打开一个聊天窗口时发生
*/
public void switchboardStarted(MsnSwitchboard switchboard) {
//msg("switchboardStarted " + switchboard);
}
// 打印联系人
private void listContacts() {
MsnContact[] cons = messenger.getContactList().getContactsInList(
MsnList.AL);
if (cons.length == 0)
msg("空");
else
msg("你现在有" + cons.length + "个联系人");
for (int i = 0; i < cons.length; i++) {
String personal = ((MsnContactImpl) cons[i]).getPersonalMessage()
.equals("") ? "空" : ((MsnContactImpl) cons[i])
.getPersonalMessage();
msg(cons[i].getDisplayName() + " " + cons[i].getEmail() + " "
+ cons[i].getStatus() + " " + personal);
}
}
}
使用说明:
登陆成功后,如果想向在线的朋友发信息,采用“对方账号:我要发的信息”这种格式发送消息,例如“abc@hotmail.com:Hello!”
如果下次还是向同一个人发消息,可以直接发送消息而不写对方账号,例如
“Hello!”
大家可以开一个MSN正式客户端和这个MSN客户端收发消息,是好用的版本O(∩_∩)O哈哈~
- JML实现控制台界面的MSN客户端(不支持离线发消息)
- jml实现msn操作
- JML---我的msn我做主
- 调用MSN发消息
- 开通MSN Messenger的离线消息 抄来的
- Java MSN Messenger Library (JML)
- 实现js界面向原生界面发消息,并跳转
- php发MSN消息-MSNP9
- nagios 使用MSN 发报警消息
- Socket编程实现简单的服务器与客户端互发消息
- 2、Java WebSocket实现服务端主动发消息给客户端
- SuperSocket 入门,实现客户端和服务端消息互发
- 文件传输及离线消息的获取 离线消息和离线文件的实现
- 简单的服务器和客户端本机发消息
- socket 服务器向指定的客户端发消息
- 在C#中实现MSN消息框的功能
- 在C#中实现MSN消息框的功能
- 在C#中实现MSN消息框的功能
- C++技术资源库(全部在Visual C++ 6.0环境下调试通过)
- JavaScript字符串函数大全
- 特殊物种--程序猿
- CPN ML语言介绍(1)
- appendChild Bug
- JML实现控制台界面的MSN客户端(不支持离线发消息)
- 从字符串中查找字符出现次数的方法和性能对比
- Linux下编译GCC
- 友元函数和友元类
- Modal view controllers
- Unix组合命令的妙用
- ...
- asp.net页面通过URL参数传值中文乱码问题解决办法
- 关于“日志”的一点心得