网络通信基础第三式——实现服务器的启停

        在之前的代码上继续写,我遇到了诸多难以解决的问题。经过自己的思考和老师的辅导,发现是我的代码结构太混乱,框架太松垮,简而言之,就是代码设计欠缺。所以,我决定重新写一遍代码。当然,在这之前我得做一件相当重要的事情,那就是画出我要实现的程序的类图。
       先普及一下类图的知识:
引用
类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图用于描述系统的结构化设计。

        以下是我设计的一个简单聊天室程序的类图:
网络通信基础第三式——实现服务器的启停_第1张图片

        设计好整个程序的框架结构后,我的心中就有了底,对以后的代码扩展,功能完善也有了信心。这好比建造一座房子,房子的结构图已经设计好,并且框架也已搭建好,下面的工作就是往里面填充各种材料了。(突然发现,其实软件工程师既是软件设计师又是IT民工,呵呵!)
        接下来,我就讲讲如何实现服务器的启停。
        首先,我先展示一下我的服务器UI界面,以方便我下面的解说。


网络通信基础第三式——实现服务器的启停_第2张图片

       以下是我实现服务器启停的核心代码:
public class SeverUI extends JFrame {

	private javax.swing.JLabel la_port;
	private javax.swing.JTextField jtf_port;
	private javax.swing.JButton bu_start;
	private ChatServer cs;

	/**
	 * 服务器界面
	 */
	public void serverUI() {

		this.setLocation(400, 300);
		this.setTitle("服务器端");
		this.setSize(300, 100);
		this.setResizable(false);// 不让窗体变大
		this.setVisible(true);
		this.setDefaultCloseOperation(3);// 关闭窗口直接退出程序
		this.setLayout(new FlowLayout());

		la_port = new JLabel("端口号:");
		jtf_port = new JTextField(10);
		bu_start = new JButton("启动服务器");

		this.add(la_port);
		this.add(jtf_port);
		this.add(bu_start);

		java.awt.event.ActionListener al_bu_start = new java.awt.event.ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String s = jtf_port.getText();
				int port = Integer.parseInt(s);

				String bu_Str = e.getActionCommand();// 得到按钮上的文字

				if (bu_Str.equals("启动服务器")) {
					cs = new ChatServer(port);
					cs.start();// 启动服务器线程
					JButton bu = (JButton) e.getSource();// 得到按钮对象
					bu.setText("停止服务器");
				} else if (bu_Str.equals("停止服务器")) {
					jtf_port.setText("");
					cs.stopServer();// 停止服务器
					cs = null;
					ChatTool.removeAllClient();// 删除所有正在运行的客户端处理线程
					System.out.println("最终在线人数:" + ChatTool.ctList.size());
					JButton bu = (JButton) e.getSource();// 得到按钮对象
					bu.setText("启动服务器");
				}

			}
		};

		bu_start.addActionListener(al_bu_start);
	}

	public static void main(String[] args) {
		SeverUI su = new SeverUI();
		su.serverUI();
	}

}

        实现服务器启停的步骤:
1、在输入框内输入为创建该服务器的指定端口号,如下图:

网络通信基础第三式——实现服务器的启停_第3张图片

2、点击“启动服务器”的按钮
cs = new ChatServer(port);
cs.start();// 启动服务器线程
JButton bu = (JButton) e.getSource();// 得到按钮对象
bu.setText("停止服务器");

        根据上述代码,创建了在指定端口下的服务器对象,启动服务器线程,并将按钮上的字符改为“停止服务器”。如下图:

网络通信基础第三式——实现服务器的启停_第4张图片

        这次启动服务器看上去和之前的没啥区别,其实已经有了很大的改进。在我启动服务器后,一旦有客户机连接成功,处理clientSocket的线程便启动,并且将这一个个clientSocket线程对象存放进一个队列中,还专门创建了一个工具类ChatTool来管理它。每启动一个clientSocket线程,就通过addClient方法将该对象加入队列中。

3、点击“停止服务器”的按钮,停止服务器
else if (bu_Str.equals("停止服务器")) {
jtf_port.setText("");
cs.stopServer();// 停止服务器
cs = null;
ChatTool.removeAllClient();// 删除所有正在运行的客户端处理线程
JButton bu = (JButton) e.getSource();// 得到按钮对象
bu.setText("启动服务器");

        根据上述代码,停止了服务器,删除了所有正在运行的客户端处理线程,并将按钮上的字符改为“启动服务器”。如下图:
网络通信基础第三式——实现服务器的启停_第5张图片

        这个停止服务器的代码,我着实想了很久。关闭服务器后,要么之前连接上的客户机还可以和服务器通信,要么新的客户机还可以继续连接服务器。经过无数次的实验,我终于基本完成停止服务器的功能。首先,我们得先将ServerSocket类的对象server强行关闭,紧接着将之前所有与该服务器连接的客户端处理线程关闭,即将存放clientSocket线程对象的队列清空。这样,就基本实现了服务器的停止。

你可能感兴趣的:(框架,UI,swing)