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

[size=large]在之前的代码上继续写,我遇到了诸多难以解决的问题。经过自己的思考和老师的辅导,发现是我的代码结构太混乱,框架太松垮,简而言之,就是代码设计欠缺。所以,我决定重新写一遍代码。当然,在这之前我得做一件相当重要的事情,那就是画出我要实现的程序的类图。[/size]
[size=small] 先普及一下类图的知识:[/size]
[quote]类图(Class diagram)是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图用于描述系统的结构化设计。[/quote]
[size=medium]以下是我设计的一个简单聊天室程序的类图:[/size]
[img]http://dl.iteye.com/upload/attachment/396662/12b6a2ed-3ec0-3f90-8f1f-caef8ff1e9a8.jpg[/img]

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

[img]http://dl.iteye.com/upload/attachment/396666/53e6164e-cc99-386b-8ef4-88c9f6ae62ba.jpg[/img]

[size=large] 以下是我实现服务器启停的核心代码:[/size]
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();
}

}

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

[img]http://dl.iteye.com/upload/attachment/396668/ef53a109-2536-39dc-bb3e-03073b923563.jpg[/img]

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

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

[img]http://dl.iteye.com/upload/attachment/396670/3b59c1f0-2744-3be4-9d87-f317fbf716cb.jpg[/img]

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

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

[size=medium] 根据上述代码,停止了服务器,删除了所有正在运行的客户端处理线程,并将按钮上的字符改为“启动服务器”。如下图:[/size]
[img]http://dl.iteye.com/upload/attachment/396674/d2ff9c84-ccae-3aac-b65e-d8526e58f5ee.jpg[/img]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值