?? 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 + -