聊天室 —— 服务器端

在这里插入图片描述

(请观看本人 聊天室总集篇 博文 —— 《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("\n");
		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)


猜你喜欢

转载自www.cnblogs.com/codderYouzg/p/12749227.html