当前位置:文档之家› 多人聊天程序课程设计报告

多人聊天程序课程设计报告

合肥学院计算机科学与技术系课程设计报告2011~2012学年第二学期课程Java语言程序设计课程设计名称多人聊天程序专业班级09网络工程(2)班姓名胡永雷指导教师张贯虹张艳明2012年9月一、需求分析聊天工具大多数由客户端程序和服务器程序外加服务器端,本程序采用客户机/服务器架构模式。

通过Java提供的Socket类来连接客户机和服务器并使客户机和服务器之间相互通信,由于聊天是多点对多点的而Java提供的多线程功能。

用多线程可完成多点对多点的聊天。

主要有两个应用程序,分别为服务器程序和客户端程序。

服务器应用程序主要用于消息转发,以及向所有用户发送系统消息等;客户端应用程序主要用于客户聊天记录的显示和信息输入。

采用Client/Server(C/S)体系结构,即客户机/服务器体系结构。

聊天服务器专门用于监控用户状态和转发消息,客户端负责接收消息的用户序列和消息文本发送到服务器。

该聊天系统实现私聊,群聊,用户登陆,退出聊天系统等功能。

二、设计1.设计思想:课程设计中利用JAVA实现基于C/S模式的聊天程序。

聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户发来的消息,客户端登录到服务器端才可以实现正常的聊天功能。

图1-1开始启动服务器判断启动信息启动客户端判断登录信息登录聊天室退出聊天室结束是是注册用户退出服务器否是否图1-22.功能设计(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(Inetaddress address,,int port)Socket (Inetaddress address, int port, Boolean stream)Socket (String host ,int port)Socket (String host ,int port, Boolean stream)ServerSocket (int port)ServerSocket ( int port, int count)通信模型中首先在客户机和服务器之间定义一套通信协议,并创立一个Socket 类,利用这个类建立一条可靠的链接;客户端发出请求,服务器端监听来自客户机的请求,并为客户端提供响应服务。

要是实现套接字的服务器端,要使用SocketServer类。

它允许程序绑定一个端口等待客户端的请求,一旦产生客户端请求,它将接受这一请求,同时产生一个完整的Socket连接对象。

服务器绑定端口必须公开,以便让客户端程序知道如何连接这个服务器。

同时作为服务器,它必须能够接受多个客户的请求,这就需要为服务器设置一个请求队列。

由于存在单个服器与多个客户程序通信,所以服务程序响应客户程序不应花很多时间,否则客户程序在得到服务前有可能花很多时间来等待通信的建立,然而服务程序和客户程序的会话可能很长,因此为加快对客户程序连接请求的响应,典型的方法是服务器主机运行一个后台线程,这个后台线程处理服务程序和客户程序的通信。

(2)数据报通信问题Java通过DatagramPacket和DatagramSocket两个类来实现UDP协议顶层的数据报。

DatagramPacket生成的对象表示一个数据报,而DatagramSocket 是用来发送和接受数据包的类。

生成DatagramPacket对象可以通过四个构造函数:DatagramPacket( byte data [ ],int size )DatagramPacket( byte data [ ],int offset, int size)DatagramPacket( byte data [ ],int size, InetAddress ipAddress, int port )DatagramPacket( byte data [ ], int offset, int size, InetAddress ipAddress, int port)对于DatagramPacket内部状态,可以使用如下方法获得:InetAddress getAddress()返回目标文件InetAddress,一般用于发送。

int getPort()返回端口号。

byte [ ] getData()返回包含在数据包中的字节数组数据。

int getLength()返回包含在将从getData()方法中返回字节数组的有效数据长度。

DatagramSocket类用来发送和结束数据包。

需要首先建立DatagramSocket对象来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。

DatagramSocket类常用的构造函数:DatagramSocket()DatagramSocket(int port)DatagramSocket(int port,InetAddress ipAddress)DatagramSocket接收数据报要用receive(DatagramSocket p)方法,而发送数据报则使用send(DatagramSocket p)方法。

要发送一个数据报首先要创建一个DatagramPacket,指定要发送的数据、数据长度、数据要发送到哪个主机和端口,然后在用DatagramSocket的send()方法发送数据包;接收一个数据报必须创建一个在本地主机的特定端口上侦听的DatagramSocket,此套接字只能接收发送至特定端口上的数据包。

2、对设计和编码的回顾讨论和分析在本程序中,用户的存储时通过链表来实现的。

用了UserLinkList定义了链表及其操作,Node定义了用户链表节点。

用户链表的结点类:public class Node {String username = null;Socket socket = null;ObjectOutputStream output = null;ObjectInputStream input = null;Node next = null;}用户链表public class UserLinkList {Node root;Node pointer;int count;构造用户链表public UserLinkList(){root = new Node();root.next = null;pointer = null;count = 0;}添加用户public void addUser(Node n)删除用户public void delUser(Node n)返回用户数public int getCount()根据用户名查找用户public Node findUser(String username)根据索引查找用户public Node findUser(int index)3、程序运行的时空效率分析本程序应用了线程对端口进行侦听。

线程一直后台开启,长期占用系统资源,但又能及时的实现端口监听和消息的收发。

4、测试数据集服务器端程序主界面:图1-3 服务器侦听端口的配置:图1-4 服务器端帮助窗口:图1-5 服务器端启动时的界面:图1-6 确认停止服务器:图1-7 客户端用户名配置界面:图1-8客户端帮助界面:图1-9 客户端程序运行主界面:图1-10服务端关闭界面:图1-11四、经验和体会经过一个学期的JAVA课程学习了解了JAVA的基础理论知识,通过这次程序设计,进一步巩固、加深了我们所学专业课程的基本理论知识,理论联系实际,进一步培养了综合分析问题,解决问题的能力,进一步加强了JAVA的实际应用能力。

相关主题