在韩顺平老师的多用户即时通信系统中实现离线留言,主要的思想是:当客户端A向客户端B发送消息时,判断客户端B是否在线,在线则直接发送,不在线则创建一个线程保存消息,等待客户端B上线后再发送给他。离线发文件同理。
public class OfflineMessageThread extends Thread{
private final String receiveUserId;
private final Message message;
public OfflineMessageThread(String receiveUserId, Message message) {
this.receiveUserId = receiveUserId;
this.message = message;
}
@Override
public void run(){
while (true){
if(ManageClientThread.isOnlineUser(this.receiveUserId)){
try {
ObjectOutputStream oos = new ObjectOutputStream(ManageClientThread.getClientThread(this.receiveUserId).getSocket().getOutputStream());
oos.writeObject(this.message);
} catch (IOException e) {
e.printStackTrace();
}
break;
}
}
}
}
在收到消息后,判断用户是否在线:
case MessageType.MESSAGE_COMMON_MESSAGE:
String getter = ms.getGetter();
String sendContent = ms.getContent();
String sendTime = ms.getSendTime();
Message ms3 = new Message();
ms3.setSender(this.userId);
ms3.setContent(sendContent);
ms3.setSendTime(sendTime);
ms3.setMesType(MessageType.MESSAGE_COMMON_MESSAGE);
ms3.setGetter(getter);
if(ManageClientThread.isOnlineUser(ms.getGetter())){
ObjectOutputStream oos2 = new ObjectOutputStream(ManageClientThread.getClientThread(getter).getSocket().getOutputStream());
oos2.writeObject(ms3);
}
else {
OfflineMessageThread offlineMessageThread = new OfflineMessageThread(getter,ms3);
offlineMessageThread.start();
}
break;