网络编程课程设计

网络编程课程设计
网络编程课程设计

课程设计说明书

课程名称:Windows网络编程

设计题目:基于JA V A网络聊天室设计

学院:计算机科学与信息工程学院

专业班级:网络工程12级

指导教师:

小组成员:

2015年6月

目录

摘要 (1)

引言: (1)

1.需求分析 (1)

1.1需求分析 (1)

1.2系统简介 (2)

2. 系统开发技术 (2)

2.1 JAVA网络编程技术 (2)

2.2 Socket套接字 (3)

2.3 TCP三次握手 (3)

3. 系统总框图与功能分析 (4)

3.1系统总框图 (4)

3.2系统功能模块分析 (5)

4. 系统模块代码设计与分析 (6)

4.1系统流程分析 (6)

4.2类的设计与分析 (7)

4.3客户端模块部分代码 (7)

4.4服务器端模块部分代码: (9)

5.系统测试 (11)

6. 总结 (13)

7.成员分工 (13)

参考文献: (14)

网络聊天室

摘要:随着我国经济发展和网络的普及,网络技术也越来越多地被应用于日常工作之中。在程序设计领域,面向对象的编程技术正在逐步代替面向过程的程序设计技术,成为计算机应用设计开发的主流,对于人与人之间通过网络的沟通和交流,聊天室是人们最常见、最直接的交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型应用。本文所介绍的网络聊天系统是基于JAVA应用程序开发设计的,其主要特性是简单、面向对象、分布式、解释执行、安全、体系结构中立、可移植、高性能、多线程以及动态性。

关键词:局域网、聊天室、JAVA、Socket、WindowsSocket

引言:目前,基于TCP/IP协议的网络得到了普及和飞速的发展,Windows下的网络程序越来越显得重要。利用TCP/IP协议提供的编程接口———Socket(套接字)可以开发出TCP/IP应用程序。正确的使用WindowsSocket,就可使得不同地址下的进程得以在Windows 环境下顺利进行各种网络通信,因此研究WinSock更有意义。而基于TCP/IP协议网络环境下的应用程序是通过客户机/服务器(C/S)作用方式模式在网络(应用)编程界面实现的。本次实验采用java语言设计一个基于C/S模式的TCP网络通讯程序。实现客户端与服务器端之间的数据传输。

1.需求分析

1.1需求分析

根据当前网络的需求,网络聊天越来越受到各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而小组成员也都学习过JAVA 语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,小组成

员一致决定以《基于JAVA的网络聊天室》为课程设计,希望通过这一次能进一步提高

我们的网络开发编程的能力。

1.2系统简介

聊天系统不外乎两个方面,服务器端和客户端。这里简要分析一下两个方面所要

完成的任务:

服务器端的任务:

1、服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断

开连接。

2、服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器

端根据要求分发信息。

客户端的任务:

1、与服务器端建立通信通道,向服务器端发送信息。

2、接收来自服务器的信息。

2.系统开发技术

2.1 JAVA网络编程技术

JA V A丰富的类库提供了大量的类以满足网络化、多线程、面向对象系统的需要。语言包提供的支持包括字符串处理、多线程处理、数学函数处理等,可以用它简单地实现JA V A程序的运行平台。实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。输入输出包用统一的"流"模型来实现所有格式的I/O,包括文件系统、网络、输入低级网络包用于实现Socket编程。抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件, 包括窗口、菜单、滚动条、对话框等,使得JA V A可以移植到不同平台的机器。网络包支持Internet的TCP/IP协议,提供了与Internet的接口。它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。

2.2 Socket套接字

Socket,简称套接字,用于实现网络上客户和服务器之间的连接。具体的说:一个服务器应用程序一般侦听一个特定的端口等待客户端的连接请求,当一个连接请求到达时,客户端和服武器端建立一个通信连接,在连接过程中,客户端被分配一个本地端口与一个Socket建立连接,客户端通过写Socket来通知服务器,以读Socket中的信息,类似的服务器也获得一个本地端口,它需要一个新的端口号来侦听原始端口上的其他连接请求。服务器也通过它的本地端口连接一个Socket,通过读写和客户端通信。

Socket程序的工作过程:

1.建立Socket连接:在通信开始之前由通信双方确认身份,建立一条专用的虚拟连接道。

2.数据通信:利用虚拟连接通道传送数据信息进行通信。

3.关闭:通信结束时,再将所建的虚拟连接拆除。

具体如下:

图1 Socket套接字的建立与连接

2.3 TCP三次握手

第一次握手:原主机发送一个带有本次连接的序号的请求的一个数据帧

第二次握手:目的主机收到请求后,如果同意连接,则发回一个带有一个本次连接序号和源端机连接序列号的确认。

第三此握手:源端机收到含有两次初始序列号的应答后,再向目的主机发送一个带有两次连接的序列号的确认。

3.系统总框图与功能分析

3.1系统总框图

图2 聊天系统框架图

3.2系统功能模块分析

图3 系统功能图

客户端:

启动连接:默认连接IP为127.0.0.1,端口为1228。

聊天:用户可以给所有人发送信息,并能看到其他用户发送给自己或所有人的消息。

断开连接:与服务器断开连接,无法发送与接收信息。

服务器端:

启动服务:绑定套接字,处于等待连接的状态,实时监控网络状态。

侦听客户端:服务器端套接字一旦监听到客户端套接字的连接请求,它就响应客户端套接字的请求,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求

断开连接:与客户端断开连接,无法侦听连接客户端。

4.系统模块代码设计与分析

4.1系统流程分析

客户端:

1.用服务器的IP地址和端口号实例化Socket对象。

2.调用connect方法,连接到服务器上。

3.将发送到服务器的IO流填充到IO对象里,比如

BufferedReader/PrintWriter。

4.利用Socket提供的getInputStream和getOutputStream方法,通过IO

流对象,向服务器发送数据流。

5.通讯完成后,关闭打开的IO对象和Socket。

服务器端:

1.在服务器,用一个端口来实例化一个ServerSocket对象。此时,服务

器就可以这个端口时刻监听从客户端发来的连接请求。

2.调用ServerSocket的accept方法,开始监听连接从端口上发来的连接

请求。

3.利用accept方法返回的客户端的Socket对象,进行读写IO的操作。

4.通讯完成后,关闭打开的流和Socket对象

4.2类的设计与分析

1.ServerUI类:服务器端界面类,主要负责服务器端的界面设计

2.Server类:此类负责创建绑定到指定服务器端口号的套接字,等待客户端连

3.ListenerClient类:此类负责侦听客户端发送信息并将信息广播出去

4.ClientUI类:客户端界面类,主要负责客户端的界面设计

5.ClientThread类:此类创建连接到服务器端的套接字,读取输入内容并发送

4.3客户端模块部分代码

客户端界面部分:

public ClientUI() {

super("客户端"); //创建ClientUI类的对象

btStart = new JButton("启动连接");//启动连接按钮

btSend = new JButton("发送信息");//发送信息按钮

tfSend = new JTextField(10);//构造一个列数为10的空TextField

tfIP = new JTextField(10);

tfPost = new JTextField(5);

taShow = new JTextArea(); //创建一个空的文本区域

/*创建“启动连接”按钮的监听器对象,监听按钮发生的动作;

*如果“启动连接”按钮被按下,则将创建的ClientUI的对象作为参数传递给ClientThread类

* */

btStart.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) { //构造匿名内部类来实现接口ActionListener

server = new ClientThread(ClientUI.this);

}

});

/*创建“发送信息”按钮的监听器对象,监听按钮发生的动作;

*如果“发送信息”按钮被按下,则将获取用户输入到文本框内的内容

* */

btSend.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

server.sendMsg(tfSend.getText());

tfSend.setText("");//设置文本框默认内容为空字符串

}

});

/*创建窗口监听器,监听窗口的动作

*如果窗口被关闭,则会弹出”确定关闭吗"的温馨提示窗口,以便用户选择

*如果用户选择“是”,则关闭窗口

* */

this.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e) {

int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",

JOptionPane.YES_NO_OPTION);

if (a == 1) {

System.exit(0); // 关闭

}

}

});

客户端连接部分:

public ClientThread(ClientUI ui) {//ClientThread类构造函数,接收客户端的界面对象

this.ui = ui;

try {

client = new Socket("127.0.0.1", 1228);//这里设置连接服务器端的IP的端口

println("连接服务器成功:端口1228");

reader = new BufferedReader(new InputStreamReader(

client.getInputStream())); //构造客户端输入流并将字节转换为字符

writer = new PrintWriter(client.getOutputStream(), true);

// 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区

} catch (IOException e) {

println("连接服务器失败:端口1228");

println(e.toString());

e.printStackTrace();

}

this.start(); //启动客户端线程

}

4.4服务器端模块部分代码:

服务器端启动部分:

public void run() { //线程开启后,执行以下操作

try {

ss = new ServerSocket(1228); //创建绑定到端口号为1228的服务器套接字对象

ui.clients=new ArrayList();//构造一个包含指定端口号的连接客户端的列表,启动服务器

println("启动服务器成功:端口1228");

while (true) { //如果服务器启动成功,执行以下操作

println("等待客户端");

Socket client = ss.accept(); //创建套接字对象,侦听并接受到此套接字的连接,在连接传入之前一直阻塞

ui.clients.add(client); //如果与客户端套接字连接成功,则将此客户端套接字添加到列表中

println("连接成功"+ client.toString()); //将客户端套接字转换为字符串输出

new ListenerClient(ui, client); //创建服务器端与客户端的监听器 }

} catch (IOException e) {//如果服务器启动失败,输出相应信息

println("启动服务器失败:端口1228");

println(e.toString());

e.printStackTrace();

}

}

服务器端侦听部分:

public void run() {

String msg = "";

while (true) {

try {

reader = new BufferedReader(new InputStreamReader(

client.getInputStream()));

writer = new PrintWriter(client.getOutputStream(), true);

msg = reader.readLine();

sendMsg(msg);

} catch (IOException e) {

println(e.toString());

// e.printStackTrace();

break;

}

if (msg != null && msg.trim() != "") {

println(">>" + msg);

}

}

}

//把信息广播到所有用户

public synchronized void sendMsg(String msg) {

try {

for (int i = 0; i < ui.clients.size(); i++) {

Socket client = ui.clients.get(i);

writer = new PrintWriter(client.getOutputStream(), true);

// 如果为 true,则 println、printf 或 format 方法将刷新输出缓冲区writer.println(msg);

}

} catch (Exception e) {

println(e.toString());

}

}

5.系统测试

1.运行服务器端,如图所示

2.运行客户端,如图所示

3.服务器启动服务,如图所示

4.客户端启动连接,如图所示

5.客户端与服务器端会话,如图所示

6.控制台显示,如图所示

6. 总结

通过本次课程设计对基于JAVA网络聊天室的设计,确实积累和总结了不少的经验,锻炼了我的独立工作和实际动手能力,加深了对计算机网络中socket工作原理及其相互联系的认识,提高了对复杂的综合性实践环节具有分析问题、解决问题、概括总结的实际工作能力,对网络编程项目的开发、设计过程有初步认识。

7.成员分工

参考文献:

[1] 李凌.WinSock 2网络编程实用教程[M].北京:清华大学出版社,2005.

[2] 董相志.Windows网络编程案例教程.北京:清华大学出版社,2014.

[3]盛华,《Java网络编程实用精解》;机械工业出版社,2009.

[4] 朱振元,朱承,刘聆,《Java语言及其网络应用》;人民邮电出版社,2006.

[5] 刘永华,于春华,《实用Java网络编程技术》;中国电力出版社,2009.

[6] 李绪成,《JavaEE5实用教程——基于WebLogic和Eclipse》;电子工业出版社,2007.

相关主题
相关文档
最新文档