📄 defaultclientmodel.java
字号:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */package chat.client;import chat.common.AbstractChatModel;import chat.common.LoginMessage;import chat.common.LogoutMessage;import chat.common.Message;import chat.common.TextMessage;import chat.common.UpdateUserMessage;import chat.common.User;import chat.common.UserListMessage;import java.io.File;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.logging.Level;import java.util.logging.Logger;import javax.swing.DefaultListModel;import javax.swing.text.Document;import javax.swing.text.html.HTMLEditorKit;/** * * @author Administrator */public class DefaultClientModel extends AbstractChatModel implements ClientModel { /** * 当前用户 */ protected User user; /** * 和服务器通信套接字 */ protected Socket socket; /** * 消息输出流 */ protected ObjectOutputStream oos; /** * 消息输入流 */ protected ObjectInputStream ois; /** * 列表框模型 */ protected DefaultListModel listModel; /** * 消息接收线程 */ protected RecvWorker worker; /** * 聊天内容文档 */ protected Document document; /** * 表情资源 */ protected Map<String, File> faceMap; /** * 单态模式 */ private static DefaultClientModel model; private DefaultClientModel() { listModel = new DefaultListModel(); listModel.addElement(User.createAllUser()); HTMLEditorKit editKit = new HTMLEditorKit(); document = editKit.createDefaultDocument(); initFaceMap(); } public Map<String, File> getFaceMap() { return faceMap; } public void setFaceMap(Map<String, File> faceMap) { this.faceMap = faceMap; } public Document getDocument() { return document; } public void setDocument(Document document) { this.document = document; } public static DefaultClientModel getInstance() { if (model == null) { model = new DefaultClientModel(); } return model; } public DefaultListModel getListModel() { return listModel; } public void setListModel(DefaultListModel listModel) { this.listModel = listModel; } /** * 发送登录消息 * @param message */ public void doLogin(LoginMessage message) { switch (message.getStatus()) { case LoginMessage.LOGIN_OK: //处理登录成功后业务 //发送获取在线用户列表消息 UserListMessage uMessage = new UserListMessage(); uMessage.setUser(message.getUser()); System.out.println("user list message " + uMessage); DefaultClientModel.getInstance().sendMsg(uMessage); break; case LoginMessage.LOGIN_FAILED: //处理登录失败后业务 //如果登录失败则关闭接收线程 worker.setStop(true); break; } //通知表现层 this.fireUserLogin(message); } public void doLogout(LogoutMessage message) { switch (message.getStatus()) { case LogoutMessage.LOGOUT_OK: worker.setStop(true); try { socket.close(); } catch (IOException ex) { Logger.getLogger(DefaultClientModel.class.getName()).log(Level.SEVERE, null, ex); } break; case LogoutMessage.LOGOUT_FAILED: break; } //通知表现层 this.fireUserLogout(message); } public void sendMsg(Message message) { try { oos.writeObject(message); oos.flush(); //如果是文本,处理表现层 if (message instanceof TextMessage) { this.fireTextMessage((TextMessage) message); } } catch (IOException ex) { Logger.getLogger(DefaultClientModel.class.getName()).log(Level.SEVERE, null, ex); } } public void doUpdateUser(UpdateUserMessage message) { switch (message.getStatus()) { case UpdateUserMessage.NEW_USER_LOGIN: listModel.addElement(message.getUser()); break; case UpdateUserMessage.USER_LOGOUT: listModel.removeElement(message.getUser()); break; } //通知表现层 this.fireUpdateUser(message); } public void startRecvWorker() { worker = new RecvWorker(this); new Thread(worker).start(); } public void connect(InetSocketAddress address) { try { socket = new Socket(address.getAddress(), address.getPort()); /** * 如果和服务器两端同顺序(先input,后output)会发生阻塞 */ oos = new ObjectOutputStream(socket.getOutputStream()); ois = new ObjectInputStream(socket.getInputStream()); } catch (IOException ex) { Logger.getLogger(DefaultClientModel.class.getName()).log(Level.SEVERE, null, ex); } } public void doUserList(UserListMessage message) { for (User user : message.getCurrentUsers()) { if (!user.equals(message.getUser())) { listModel.addElement(user); } } this.fireUserList(message); } public void doTextMessage(TextMessage message) { this.fireTextMessage(message); } private void initFaceMap() { faceMap = new HashMap<String, File>(); File faceFiles = new File("face/"); File files[] = faceFiles.listFiles(); for (File f : files) { String fileName = f.getName().substring(0, f.getName().lastIndexOf('.')); faceMap.put("(" + fileName + ")", f); } } public String insertFace(String htmlText) { for (String key : faceMap.keySet()) { if (htmlText.contains(key)) { htmlText = htmlText.replace(key, "<img src=\"file:" + faceMap.get(key).getAbsolutePath() + "\"/>"); } } return htmlText; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -