`
王者无敌Java
  • 浏览: 70547 次
  • 性别: Icon_minigender_1
  • 来自: 盐城->长沙->深圳
社区版块
存档分类
最新评论

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

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

        以下是我设计的一个简单聊天室程序的类图:


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




       以下是我实现服务器启停的核心代码:
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、在输入框内输入为创建该服务器的指定端口号,如下图:



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

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



        这次启动服务器看上去和之前的没啥区别,其实已经有了很大的改进。在我启动服务器后,一旦有客户机连接成功,处理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("启动服务器");

        根据上述代码,停止了服务器,删除了所有正在运行的客户端处理线程,并将按钮上的字符改为“启动服务器”。如下图:


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

相关推荐

    网络通信基础第六式——功能完善界面美化的KTM

    【网络通信基础第六式——功能完善界面美化的KTM】是一个关于软件开发的主题,主要探讨的是如何提升网络通信工具的功能性和用户体验。在这个过程中,KTM(可能是“Kernel Traffic Manager”或者自定义的缩写)被用作...

    vc网络通信编程实用案例精选——源代码.rar

    在《VC网络通信编程实用案例精选(第二版)——源代码》这个压缩包中,读者可以找到以上所有知识点的实现代码,通过实践学习加深理解。每份源代码都是一个独立的案例,涵盖了从基础到高级的网络编程技巧,是提升VC++...

    计算机网络课程设计——FTP服务器配置

    计算机网络课程设计——FTP服务器配置是指使用Serv-U服务器软件,构建FTP服务器,实现文件在客户端之间通过服务器的传输以及通过客户端实现文件上传、下载功能,并能够对服务器进行管理和维护。 一、网络基础知识 ...

    通信网络基础答案——中国大学mooc.docx

    通信网络基础国家精品——西安电子科技大学 课后习题和考试参考答案

    通信——实现多人聊天室

    在IT行业中,构建一个多人聊天室是常见的应用场景,如标题所示,这通常涉及到网络通信、多线程编程、用户界面设计等技术。这篇博客“通信——实现多人聊天室”(博文链接:...

    VB源代码——代理服务器软件

    通过分析和研究这些文件,开发者可以学习到如何使用VB编写代理服务器程序,包括网络通信的实现、多线程处理、错误处理和日志记录等方面的知识。 总结来说,这个VB源代码项目是一个实用的代理服务器软件,它展示了VB...

    手机安全卫士(3)——获取服务器更新配置

    本节我们将探讨“手机安全卫士(3)——获取服务器更新配置”这一主题,这涉及到应用如何通过网络与远程服务器进行通信,以获取最新的安全策略和更新数据。 首先,我们需要理解的是Android应用程序如何进行网络通信...

    未来网络白皮书——无服务器边缘计算网络白皮书.pdf

    无服务器边缘计算网络是当前信息技术领域的一个前沿话题,它结合了边缘计算和无服务器计算的优势,旨在优化资源利用,提供高效、低延迟的服务。边缘计算将数据处理和应用执行推向网络边缘,靠近数据生成和消费的地方...

    无线通信实践教学模块设计——基于d1800的调频收音机对讲机系统设计-毕业设计.doc

    无线通信实践教学模块设计——基于D1800的调频收音机对讲机系统设计 本文介绍了无线通信实践教学模块设计,基于D1800的调频收音机对讲机系统设计。该设计将调频收音机对讲机系统设计列为无线通信教学模块,作为高校...

    QT——服务器+客户端进行tcp通信代码.rar

    在"QT——服务器+客户端进行tcp通信代码.rar"这个压缩包中,包含了一个客户端(client)和一个服务器端(server)的工程,这让我们有机会深入理解QT如何实现TCP/IP通信。 首先,TCP(传输控制协议)是互联网协议栈...

    计算机通信教程——第四版——第一章 概述

    - **参考书目**:提供了多本相关的书籍作为辅助阅读材料,如谢希仁的《计算机网络》(第3版)、顾尚杰的《计算机通信网基础》等。 #### 课程相关信息 - **授课教师**:陈家琪教授。 - **联系方式**:电子邮件 cjq@...

    通信网络(下)——华为教程

    公共电话网,有线接入网,移动电话网,华为设备

    Android基础——实现安卓蓝牙2.0模块的通信功能

    在Android平台上,实现蓝牙2.0模块的通信功能是移动应用开发中的一个重要环节,尤其对于那些需要设备间无线数据传输的应用。蓝牙2.0技术,也称为Enhanced Data Rate (EDR)蓝牙,提升了传输速度,降低了功耗,使得它...

    UDP通信——客户端循环向服务器端发送图像.rar

    在UDP通信中,客户端和服务器端都需要实现特定的程序来处理图像数据的发送和接收。`UDPTest`可能是一个客户端程序,用于读取本地图像文件并将其打包成UDP数据报文,然后通过网络发送到服务器端。`UDPServer`则可能是...

    [单片机通信技术应用实例——基于STC15W系列单片机][周长锁,王旭][配套资料].rar

    《单片机通信技术应用实例——基于STC15W系列单片机》是一本深入探讨单片机通信技术的实践教程,由周长锁和王旭两位专家编写。本书聚焦于STC15W系列单片机,该系列是STC公司推出的一款高性能、低功耗的8051内核...

    安卓Andriod源码——实现网络摄像头功能.zip

    这个压缩包文件“安卓Andriod源码——实现网络摄像头功能.zip”很可能包含了一个示例项目,用于帮助开发者理解并实现这一功能。下面我们将深入探讨实现网络摄像头功能在Android中的关键知识点。 1. **网络通信**: ...

    ASP.NET源码——FTP服务器源码(C245).zip

    这个压缩包"ASP.NET源码——FTP服务器源码(C245).zip"包含了一个用ASP.NET实现的FTP(File Transfer Protocol)服务器的源代码。FTP服务器允许用户通过网络上传、下载文件,是互联网上数据共享和传输的重要工具。 ...

    网管员必读——网络基础(第2版)

    资源名称:网管员必读——网络基础(第2版)内容简介: 网管员必读:网络基础(第2版)由王达先生精心编著,是一本网络基础学习入门书籍。网管员必读:网络基础(第2版)是在网管员必读—网络基础(第1版)基础上修改而...

    zinx —— golang —— MMO游戏服务器开发对应客户端

    在Golang中,可以使用标准库"net"进行网络通信,"encoding/json"或"gob"进行数据序列化,实现客户端与服务器之间的数据交换。为了优化性能,客户端可能会采用异步I/O模型,利用goroutine处理网络事件,避免阻塞主线...

Global site tag (gtag.js) - Google Analytics