一对多的聊天程序设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实习题目:一对多的聊天程序设计
设计要求:实现一个一对多的聊天程序:包含服务器端和客户端;要求具有图
形界面;支持多人聊天;可采用UDP或者TCP协议。
原理概述:本程序是利用java程序实现一对多聊天软件的设计。首先编写服务器端的程序ChatServer,然后编写客户端的程序ChatApplet,客户端程序是可以嵌入到浏览器里的Applet里的小程序,即客户端通过网页登陆。服务器端的程序为每个连入的ChatApplet创建一个对应的线程,该线程监听对应Applet 是否有消息传来,若有消息传来则把信息广播给每个连入的客户端Applet。服务器程序的主入口是main()方法,它负责服务端口的定义和初始化以及接受用户的连入请求并通知所有用户Applet有新用户加入,而且循环监听。监听线程采用的是Runnable接口,线程的执行体是在Run()方法中实现的,调用线程是由main()方法中的语句new Thread(st).start();,另外发送信息采用的是线程同步机制Synchronized()。
设计方案:一.通讯协议的选择
TCP与UDP有各自的优点。TCP是面向连接的协议,能满足大范围的应用程序的要求,能调节网际的动态环境,建立和管理本地通信进程之间的对话,维护TCP在流出和流入传输层TCP的模块的每个用户的状态和信息,拥有窗口流量控制机制和重传机制,实现非常可靠的数据传输,它的安全性和可靠性比UDP要高出很多。UDP是面向非连接的传输协议,UDP的应用程序在高可靠性、低延迟的网络中运行很好,在通讯子网QoS相对低下的情况下,可能无法正常运行,因为在于数据包的频繁丢失。虽然UDP如此不可靠,但是由于它传输的高效率,仍然被广泛采用。在某些场合的一来一往只有两次数据报的交换中,UDP比TCP更加有效,因为TCP的建立连接和撤消连接的开销往往要大得多。
本程序设计在客户端与服务器端的协议采用了UDP,虽然在效率上占了优势,因为依照目前网络通讯的发展,通信子网在其性能上的提高,使得UDP 可以发挥其强大的优势,但是安全性却实在令人担忧。
综合考虑的结果,在本聊天工具的客户端和服务器端的通讯采用TCP协议。而客户与客户端的通讯采用UDP协议。
二.线程技术的选择
在单线程系统中,如果系统进行如网络数据发送等在后台进行工作的应用程序时,程序界面就会处于死锁状态,无法接受用户的输入。但抢占式多任务,每一个进程可以同时执行多个任务,对于本系统,既要保证多用户之间可以进行聊天,又要保持对用户的响应,使用多线程是最佳选择。
三.套接字SOCKET的应用
所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通
过SocketImpl类及其子类完成的。getInputStream方法获得网络连接输入,同时返回一个IutputStream对象实例。getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。但是应注意getInputStream和getOutputStream方法均会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。
四.程序的设计
总体设计流程图如下所示:
首先是服务器端程序的设计,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。服务器端的程序为每个连入的ChatApplet创建一个对应的线程,该线程监听对应Applet是否有消息传来,若有消息传来则把信息广播给每个连入的客户端Applet。服务器程序的主入口是main()方法,它负责服务端口的定义和初始化以及接受用户的连入请求并通知所有用户Applet有新用户加入,而且循环监听。一旦有用户接入,服务器就将用户接入的信息广播给所有已经接入的用户,说明可以进行聊天,同时,当用户在消息框中输入leave后,服务器将向所有已经接入的用户广播用户已经离开的信息而不是发送leave字符,提示用户已经离开,不能再继续进行通话。
客户端程序的设计,首先考虑的是客户端界面的设计,界面的设计要考虑
到美观和可用性,但是又不能太过复杂。本程序开发利用JBuilder 9.0进行
开发,首先建立Applet小程序,在建立完成后可以发现在工程视窗中可以发
现多了两个文件Applet1.html和Applet1.java,时因为在生成Applet源文
件的同时自动生成相应的HTML文件。选择内容视窗下方的文件视窗标签中的“Design”,进入可视化见面设计窗口,如下图所示:
在内容视窗中添加所需控件,本例中共用到3个“JLabel”控件、1个“JTestField”、1个“JButton”、1个“JScrollPane”和1个“JtextArea”,其中只用控件“JScrollPane”在“Swing Contains”控件选择面板上,其它均在“Swing”控件选择面板上。需要注意的是:在添加控件“JScrollPane”和“JtextArea”时,先要添加控件“JScrollPane”到内容视窗中,然后把控件“JtextArea”添加到控件“JScrollPane”,这样才能实现文本内容可以多行显示,即通过拖动滚动条查看上下文。对于控件的相关属性的修改,如控件的名称、背景、大小、位置,字体的颜色、大小等均在事件、属性列表框中进行。只要选择相应控件,此时在事件、属性列表框中显示的就是它的相关属性和参数,可以根据需要进行修改。下面只演示一下一个修改控件“JButton”名称:选择内容视窗中的按钮控件,此时在右边的事件、属性列表框中显示了它的所用相关属性,拖动滚动条会找到一个属性“text”,一开始默认参数为“jButton1”,现在我们改为“发送”,这样按钮上显示的就是“发送”。
客户端的代码包括与服务器建立连接代码、信息处理代码、控件定义代码,其中需要手工添加只有前两个,第三个时在添加控件时自动生成的。信息处理代码:这部分代码又分2部分,分别是接收数据和发送数据处理。接收数据代码可设计使用线程,本例中采用了Runnable接口,实现run()方法,调用语句为:new Thread(this).start();,且调用语句放在结构初始化函数jbInit()的末行。这样在客户端界面初始化完毕立即启动等待接收进程。发送数据代码很简单,就