多人聊天程序课程设计报告.docx
《多人聊天程序课程设计报告.docx》由会员分享,可在线阅读,更多相关《多人聊天程序课程设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
多人聊天程序课程设计报告
计算机科学与技术系
课程设计报告
2013~2014学年第一学期
课程
Java语言程序设计
课程设计名称
多人聊天程序
专业班级
10计本
(2)班
姓名
*****
指导教师
*****
2013年10月11号
一、需求分析
聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。
通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。
用多线程可完成多点对多点的聊天。
主要有两个应用程序,分别为服务器程序和客户端程序。
服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。
采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。
聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。
该聊天系统实现私聊,群聊,用户登陆,退出聊天系统等功能。
二.设计
1.设计思想:
课程设计中利用JAVA实现基于C/S模式的聊天程序。
聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客户端登录到服务器端才可以实现正常的聊天功能。
2.功能设计
(1)服务器端的主要功能如下。
在特定端口上进行侦听,等待客户端连接。
用户可以配置服务端的侦听端口,默认端口为8888.
向已经连接到服务端的用户发送系统消息。
统计在线人数。
当停止服务时,断开所有用户连接。
(2)客户端的主要功能如下。
连接到已经开启聊天服务的服务端。
用户可以配置到连接服务器的IP地址和端口号。
用户可以配置连接后显示的用户名。
当服务器端开启的话,用户可以随时登录与注销。
用户可以向所有人或者某一个人发送消息。
3.详细设计
聊天室服务器端设计
聊天室服务器主要包括7个文件,他们功能如下。
(1)ChatServer.java
包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。
调用ServerListen类来实现服务端用户上线与下线侦听,调用ServerReceive类来实现服务器端的消息收发。
(2)ServerListen.java
该类实现服务端用户上线与下线的侦听。
该类对用户上线下线的侦听通过调用用户链表来实现,当用户上线与下线情况发生的时候,该类会对主类的界面进行相应的修改。
(3)ServerReceive.java
该类是实现服务器消息收发的类,该类分别定义了向某用户及所有人发送消息的方法,发送消息会显示在主界面类的界面上。
(4)Portconf.java
该类继承自JDialog,是用户对服务器端侦听端口进行配置的的类。
(5)Node.java
用户链表的节点类,定义了链表中的用户。
(6)UserLinkList.java
用户链表节点的具体实现类,该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户、根据索引查找用户这五个方法。
(7)Help.java
服务器端的帮助类。
聊天室客户端设计
聊天室客户端主要包括5个文件,他们的功能如下。
(1)Chatclient.java
包含名为Chatclient的Public类,其主要功能为定义客户端的界面,添加事件侦听与事件处理。
该类定义了Connect()与Disconnect()方法实现与服务器连接与断开连接。
当SendMessege()方法来向其他用户发送带有表情的消息或者悄悄话。
(2)ClientReceive.java
该类是实现服务器端与客户端消息收发的类。
(3)ConnectConf.java
该类继承自Jdialog,是用户所要连接的服务器IP及侦听端口进行修改配置的类。
(4)UserConf.java
该类继承自Jdialog,是用户对连接到服务器时所显示的用户名进行修改配置的类。
(5)Help.java
客户端程序的帮助类。
三.调试及测试
1、调试过程中遇到的主要问题及解决方法
程序中主要问题为:
(1)套接字的通信问题
网络上两个程序通过一个双向的通信链接实现数据交换,每一端都建立一个Socket,通过对Socket的读写操作实现网络的通信功能。
Socket通信程序的基本结构的基本结构主要有创建Socket、打开连接到Socket的输入流和输出流、按照一定的协议对Socket进行读写操作、关闭Socket这四个步骤。
为了完成Socket通信,包中提供了Socket和ServerSocket这两个类,他们分别用来表示双向连接的客户端和服务器。
构造函数如下:
Socket(Inetaddressaddress,,intport)
Socket(Inetaddressaddress,intport,Booleanstream)
Socket(Stringhost,intport)
Socket(Stringhost,intport,Booleanstream)
ServerSocket(intport)
ServerSocket(intport,intcount)
通信模型中首先在客户机和服务器之间定义一套通信协议,并创立一个Socket类,利用这个类建立一条可靠的链接;客户端发出请求,服务器端监听来自客户机的请求,并为客户端提供响应服务。
要是实现套接字的服务器端,要使用SocketServer类。
它允许程序绑定一个端口等待客户端的请求,一旦产生客户端请求,它将接受这一请求,同时产生一个完整的Socket连接对象。
服务器绑定端口必须公开,以便让客户端程序知道如何连接这个服务器。
同时作为服务器,它必须能够接受多个客户的请求,这就需要为服务器设置一个请求队列。
由于存在单个服器与多个客户程序通信,所以服务程序响应客户程序不应花很多时间,否则客户程序在得到服务前有可能花很多时间来等待通信的建立,然而服务程序和客户程序的会话可能很长,因此为加快对客户程序连接请求的响应,典型的方法是服务器主机运行一个后台线程,这个后台线程处理服务程序和客户程序的通信。
(2)数据报通信问题
Java通过DatagramPacket和DatagramSocket两个类来实现UDP协议顶层的数据报。
DatagramPacket生成的对象表示一个数据报,而DatagramSocket是用来发送和接受数据包的类。
生成DatagramPacket对象可以通过四个构造函数:
DatagramPacket(bytedata[],intsize)
DatagramPacket(bytedata[],intoffset,intsize)
DatagramPacket(bytedata[],intsize,InetAddressipAddress,intport)
DatagramPacket(bytedata[],intoffset,intsize,InetAddressipAddress,intport)
对于DatagramPacket内部状态,可以使用如下方法获得:
InetAddressgetAddress()
返回目标文件InetAddress,一般用于发送。
intgetPort()
返回端口号。
byte[]getData()
返回包含在数据包中的字节数组数据。
intgetLength()
返回包含在将从getData()方法中返回字节数组的有效数据长度。
DatagramSocket类用来发送和结束数据包。
需要首先建立DatagramSocket对象来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。
DatagramSocket类常用的构造函数:
DatagramSocket()
DatagramSocket(intport)
DatagramSocket(intport,InetAddressipAddress)
DatagramSocket接收数据报要用receive(DatagramSocketp)方法,而发送数据报则使用send(DatagramSocketp)方法。
要发送一个数据报首先要创建一个DatagramPacket,指定要发送的数据、数据长度、数据要发送到哪个主机和端口,然后在用DatagramSocket的send()方法发送数据包;接收一个数据报必须创建一个在本地主机的特定端口上侦听的DatagramSocket,此套接字只能接收发送至特定端口上的数据包。
2、对设计和编码的回顾讨论和分析
在本程序中,用户的存储时通过链表来实现的。
用了UserLinkList定义了链表及其操作,Node定义了用户链表节点。
用户链表的结点类:
publicclassNode{
Stringusername=null;
Socketsocket=null;
ObjectOutputStreamoutput=null;
ObjectInputStreaminput=null;
Nodenext=null;
}
用户链表
publicclassUserLinkList{
Noderoot;
Nodepointer;
intcount;
构造用户链表
publicUserLinkList(){
root=newNode();
root.next=null;
pointer=null;
count=0;
}
添加用户
publicvoidaddUser(Noden)
删除用户
publicvoiddelUser(Noden)
返回用户数
publicintgetCount()
根据用户名查找用户
publicNodefindUser(Stringusername)
根据索引查找用户
publicNodefindUser(intindex)
3、程序运行的时空效率分析
本程序应用了线程对端口进行侦听。
线程一直后台开启,长期占用系统资源,但又能及时的实现端口监听和消息的收发。
4、测试数据集
服务器端程序主界面:
服务器侦听端口的配置:
服务器端帮助窗口:
服务器端启动时的界面:
确认停止服务器:
客户端用户名配置界面:
客户端帮助界面:
客户端程序运行主界面:
四、经验和体会。
经过一个学期的JAVA课程学习了解了JAVA的基础理论知识,通过这次程序设计,进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养了综合分析问题,解决问题的能力,进一步加强了JAVA的实际应用能力。
通过本次Java语言课程设计,我对面向对象的程序设计有了更深程度的掌握,它将重点放在对象与对象的接口上。
在通过对题目进行需求分析,考虑一些编程中可能遇到的问题。
其次开始界面设计、类的设计、类功能的连接等等实现。
在遇到问题解决问题的过程中不断完善功能。
同时在老师和同学的帮助下,不断完善自己的成果,不断改进,不断进步。
这次Java课程设计不仅考查了对Java语言基本理论知识的学习程度还考核了我们综合运用以及学习新知识的能力。
我也在和同学老师的交流中感觉到一个人的力量或许很渺小,而Java程序设计不仅仅是一个人能够解决所有问题的,当我们走出学校,面向社会的时候,我们需要更多的去与人交流,融入一个团体中,大家位一个共同的目标奋斗。
这次课程设计不仅仅让我在掌握课本上的知识里更进一步,也让我体会到很多以后必须面对的问题。
在以后的学习以及未来的工作生活中我们都要好好把握我们需要去掌握的东西,能让我们更好去适应社会需求的知识我们一定不要错过。