⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 defaultclientmodel.java

📁 java chat java chat简易聊天室程序源代码,有很高的参考价值,能在它的基础上进行2次开发.
💻 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 + -