• 聊天室 —— 服务器端


    在这里插入图片描述

    (请观看本人 聊天室总集篇 博文 —— 《CSFramework 聊天室》


    首先,由于我们来编写model层:

    model层

    而且,只要我们执行 注册/上线/注销 操作,就要在存储客户端信息的地方(一般在公司里,用的是数据库,但是,在此处重点考察的是基本知识点,本人就用一份XML文件来存储用户信息了)
    增加/查询/删除 客户端信息

    所以,本人就先来编写存储用户信息的类:

    UserInfo类:

    package edu.youzg.chat_room.server.user.model;
    
    public class UserInfo {
    	private String id;
    	private String nick;
    	private String password;
    
    	public UserInfo() {
    	}
    
    	public String getId() {
    		return id;
    	}
    
    	public void setId(String id) {
    		this.id = id;
    	}
    
    	public String getNick() {
    		return nick;
    	}
    
    	public void setNick(String nick) {
    		this.nick = nick;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    
    	@Override
    	public String toString() {
    		return nick;
    	}
    
    }
    

    那么,我们再来实现下用于 从数据库(此处是从XML配置文件中)处理用户数据的 dao层:

    dao层

    本人现在来编写下dao层的 UserDao类

    UserDao类:

    package edu.youzg.chat_room.server.user.dao;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.Element;
    
    import edu.youzg.chat_room.server.user.model.UserInfo;
    import edu.youzg.util.XMLParser;
    
    public class UserDao {
    	private Document document;
    
    	public UserDao() {
    		this.document = XMLParser.getDocument("/student.xml");
    	}
    
    	public UserInfo getUser(String id) {
    		UserInfo user = new UserInfo();
    		new XMLParser() {
    			@Override
    			public void dealElement(Element element, int index) {
    				String strId = element.getAttribute("id");
    				if (!strId.equals(id)) {
    					return;
    				}
    
    				String nick = element.getAttribute("nick");
    				String password = element.getAttribute("password");
    				user.setId(strId);
    				user.setNick(nick);
    				user.setPassword(password);
    			}
    		}.parseTag(this.document, "student");
    		
    		if (user.getId() == null) {
    			return null;
    		}
    		
    		return user;
    	}
    	
    }
    

    现在,我们来实现下处理客户端请求 的action层

    action层

    因为本人说过:搭建聊天室,我们就要处理用户的各种资源请求,
    所以,本人现在来编写处理客户端请求UserAction类

    UserAction类:

    package edu.youzg.chat_room.server.user.action;
    
    import edu.youzg.chat_room.server.user.model.UserInfo;
    import edu.youzg.chat_room.server.user.service.UserService;
    import edu.youzg.csframework.action.Actioner;
    import edu.youzg.csframework.action.Argument;
    import edu.youzg.csframework.action.Mapping;
    
    @Actioner
    public class UserAction {
    	private UserService userService;
    
    	public UserAction() {
    		this.userService = new UserService();
    	}
    	
    	@Mapping("userLogin")
    	public UserInfo getUserById(
    			@Argument("id") String id,
    			@Argument("password") String password) {
    		UserInfo user = userService.getUserById(id, password);
    		
    		if (user == null) {
    			user = new UserInfo();
    			user.setId("ERROR");
    		} else {
    			user.setPassword(null);
    		}
    		
    		return user;
    	}
    
    }
    

    现在,本人再来编写下用于从用户界面上获取用户数据的server层

    server层

    UserService类:

    package edu.youzg.chat_room.server.user.service;
    
    import edu.youzg.chat_room.server.user.dao.UserDao;
    import edu.youzg.chat_room.server.user.model.UserInfo;
    
    public class UserService {
    	private UserDao userDao;
    	
    	public UserService() {
    		this.userDao = new UserDao();
    	}
    
    	public UserInfo getUserById(String id, String password) {
    		UserInfo user = userDao.getUser(id);
    		
    		if (user == null || !password.equals(user.getPassword())) {
    			return null;
    		}
    		
    		return user;
    	}
    	
    }
    

    那么,现在,本人就来编写下服务器界面的view层

    view层

    本人现在来编写下 ChatRoomServerView类:

    ChatRoomServerView类:

    package edu.youzg.chat_room.server.view;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.IOException;
    
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextArea;
    import javax.swing.JTextField;
    import javax.swing.border.TitledBorder;
    
    import edu.youzg.csframework.core.IListener;
    import edu.youzg.csframework.core.Server;
    import edu.youzg.util.FrameIsNullException;
    import edu.youzg.util.IMecView;
    import edu.youzg.util.PropertiesParser;
    import edu.youzg.util.ViewTool;
    
    public class ChatRoomServerView implements IMecView, IListener {
    	private Server server;
    
    	private JFrame jfrmServerView;
    	private JTextField jtxtCommand;
    	private JTextArea jtatMessage;
    
    	public ChatRoomServerView() {
    		this.server = new Server();
    		this.server.addListener(this);
    	}
    
    	public ChatRoomServerView initServer() {
    		this.server.initServer("/server.cfg.properties");
    		initView();
    		return this;
    	}
    
    	@Override
    	public void init() {
    		jfrmServerView = new JFrame("右转聊天室");
    		jfrmServerView.setLayout(new BorderLayout());
    		jfrmServerView.setMinimumSize(new Dimension(800, 600));
    		jfrmServerView.setExtendedState(JFrame.MAXIMIZED_BOTH);
    		jfrmServerView.setLocationRelativeTo(null);
    		jfrmServerView.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		
    		JLabel jlblTopic = new JLabel("右转哥粉丝聊天室", JLabel.CENTER);
    		jlblTopic.setFont(topicFont);
    		jlblTopic.setForeground(topicColor);
    		jfrmServerView.add(jlblTopic, BorderLayout.NORTH);
    		
    		JPanel jpnlFooter = new JPanel(new FlowLayout());
    		jfrmServerView.add(jpnlFooter, BorderLayout.SOUTH);
    		
    		JLabel jlblCommand = new JLabel("命令:");
    		jlblCommand.setFont(normalFont);
    		jpnlFooter.add(jlblCommand);
    		
    		jtxtCommand = new JTextField(40);
    		jtxtCommand.setFont(normalFont);
    		jpnlFooter.add(jtxtCommand);
    		
    		JPanel jpnlLeftBlank = new JPanel();
    		JLabel jlblLeftBlank = new JLabel(" ");
    		jlblLeftBlank.setFont(normalFont);
    		jpnlLeftBlank.add(jlblLeftBlank);
    		jfrmServerView.add(jpnlLeftBlank, BorderLayout.WEST);
    		
    		JPanel jpnlRightBlank = new JPanel();
    		JLabel jlblRightBlank = new JLabel(" ");
    		jlblRightBlank.setFont(normalFont);
    		jpnlRightBlank.add(jlblRightBlank);
    		jfrmServerView.add(jpnlRightBlank, BorderLayout.EAST);
    		
    		jtatMessage = new JTextArea();
    		jtatMessage.setFont(normalFont);
    		jtatMessage.setEditable(false);
    		jtatMessage.setFocusable(false);
    		JScrollPane jscpMessage = new JScrollPane(jtatMessage);
    		TitledBorder ttbdMessage = new TitledBorder("系统消息");
    		ttbdMessage.setTitleFont(normalFont);
    		ttbdMessage.setTitleColor(Color.red);
    		ttbdMessage.setTitlePosition(TitledBorder.ABOVE_TOP);
    		ttbdMessage.setTitleJustification(TitledBorder.CENTER);
    		jscpMessage.setBorder(ttbdMessage);
    		
    		jfrmServerView.add(jscpMessage, BorderLayout.CENTER);
    	}
    
    	@Override
    	public void reinit() {
    	}
    
    	private void closeServer() {
    		if (server.isStartup()) {
    			ViewTool.showWarnning(jfrmServerView, "服务器尚未宕机!");
    			return;
    		}
    		try {
    			exitView();
    		} catch (FrameIsNullException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	@Override
    	public void dealEvent() {
    		jfrmServerView.addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				closeServer();
    			}
    
    			@Override
    			public void windowOpened(WindowEvent e) {
    				PropertiesParser property = new PropertiesParser();
    				String strAutoStartup = property.value("autoStartup");
    				if (strAutoStartup.equalsIgnoreCase("true")) {
    					try {
    						server.startup();
    					} catch (IOException e1) {
    						e1.printStackTrace();
    					}
    				}
    			}
    
    		});
    		
    		jtxtCommand.addActionListener(new ActionListener() {
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				String command = jtxtCommand.getText().trim();
    				if (command.length() <= 0) {
    					return;
    				}
    				dealCommand(command);
    				jtxtCommand.setText("");
    			}
    		});
    	}
    	
    	private void dealCommand(String command) {
    		if (command.equalsIgnoreCase("startup")
    				|| command.equalsIgnoreCase("st")) {
    			try {
    				server.startup();
    			} catch (IOException e) {
    				ViewTool.showError(jfrmServerView, e.getMessage());
    			}
    		} else if (command.equalsIgnoreCase("shutdown")
    				|| command.equalsIgnoreCase("sd")) {
    			server.shutdown();
    		} else if (command.equalsIgnoreCase("exit")
    				|| command.equalsIgnoreCase("x")) {
    			closeServer();
    		} else if (command.equalsIgnoreCase("forcedown")
    				|| command.equalsIgnoreCase("fd")) {
    			server.forcedown();
    		}
    	}
    
    	@Override
    	public JFrame getFrame() {
    		return jfrmServerView;
    	}
    	
    	@Override
    	public void processMessage(String message) {
    		jtatMessage.append(message);
    		jtatMessage.append("
    ");
    		jtatMessage.setCaretPosition(jtatMessage.getText().length());
    	}
    
    }
    

    在文末,本人来给出两个服务器端运行必须的配置文件

    配置文件

    首先是 用于初始化Serverserver.cfg.properties文件

    server.cfg.properties文件:

    port=6666
    maxClientCount=10
    autoStartup=true
    

    然后是 用于存储同学们信息student.xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <students>
    	<student id="20200001" nick="天蓬" password="1450575459"></student>
    	<student id="20200002" nick="齐天" password="1450575459"></student>
    	<student id="20200003" nick="卷帘" password="1450575459"></student>
    	<student id="20200004" nick="玄奘" password="1450575459"></student>
    </students>
    

    至于运行结果,本人将放在总集篇为同学们展示。

    (本人 聊天室总集篇 博文 ——《CSFramework 聊天室》链接:
    https://www.cnblogs.com/codderYouzg/p/12749222.html)


  • 相关阅读:
    Hive 复杂数据类型的使用
    Hive 函数之内置运算符
    Hive中Join的类型和用法
    Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)
    初步认识Hive
    Hadoop之MapReduce
    我理解中的Hadoop HDFS分布式文件系统
    Hadoop环境搭建 (伪分布式搭建)
    Hadoop(初始Hadoop)
    【数据库】MySQL 从安装到命令
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12749227.html
Copyright © 2020-2023  润新知