Java聊天室毕业论文

更新时间:2024-05-25 18:13:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

河南理工大学本科生毕业设计(论文)说明书

摘 要

JAVA语言是目前Internet上大型的WEB应用程序开发时使用得最热门的编程语言,本文描述了JAVA技术的特点以及在互联网上的使用情况,介绍这种技术的重要编程方法,并以JAVA开发技术为核心的网上聊天系统。

本系统利用Java实现基于C/S模式的聊天程序。聊天室共分为服务器端和客户端两部分,服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务端才可以实现正常的聊天功能。服务器端的主要实现:在特定端口上进行侦听,等待客户端连接;用户可以配置服务端的侦听端口,默认端口为8888;向已经连接到服务端的用户发送系统消息;统计在线人数;当停止服务时,断开所有的用户连接。客户端的主要功能为:连接到已经开启服务的服务端;用户可以配置要连接服务器端的IP地址与端口号;用户可以配置连接后显示的用户名;当服务器端开启的话,用户可以随时登录与注销;用户可以向所有人或某一个人发送消息。从而客户与客户之间以及客户与服务器之间可以简单方便地进行通信。

主要使用Sun公司提供Java语言、jdk开发环境及套接字通信socket技术,完成了对服务器端和客户端之间相互交流功能的实现。 关键词:JAVA, SOCKET, JAVA聊天室

I

河南理工大学本科生毕业设计(论文)说明书

Abstract

The JAVA language is on present Internet when the large-scale WEB application procedure development used the most popular programming language, this article described the JAVA technology characteristic as well as on Internet's service condition, introduced that this kind of technical the important programming method, and on-line chatted the system take the JAVA development technology as the core.

This system realizes using Java based on the C/S pattern chats the procedure. The chatroom altogether divides into the server end and the client side two parts, the news which the server end procedure primary cognizance interception client side sends, the client side must register the service end only then to be possible to realize normally chats the function. The server end main realizes: Carries on the interception on the specific port, the waiting client side connection; The user may dispose the service end the interception port, tacitly approves the port is 8888; To already connected the service end the user transmitting system news; Counts the online population; When the stop serves, separates all user connection. The client side major function is: Connected already opened the service the service end; The user may dispose must connect the server end the IP address and the port number; After the user may dispose the connection, demonstrated user; When the server end opening words, the user may momentarily register with logging out; The user may to all people or someone sending a message. Thus between the customer and the customer as well as the customer and the server may carry on the correspondence conveniently simply.

Mainly uses Sun Corporation to provide the Java language, the jdk development environment and the sleeve joint character corresponds the

II

河南理工大学本科生毕业设计(论文)说明书

socket technology, has completed exchanges function realization mutually to between the server end and the client side.

keywords: JAVA, SOCKET, JAVA chatroom

III

河南理工大学本科生毕业设计(论文)说明书

目 录

1 前言 ..................................................... 1 2 概论 ..................................................... 2 2.1 JAVA的网络功能与编程 ................................. 2 2.1.1 JAVA概述 ........................................... 2 2.1.2 JAVA的特点 ......................................... 3 2.1.3 JAVA语言在网络上的应用 ............................. 6 2.2 数据报通信常识 ........................................ 7 2.3 URL与URLCONNECTION ..................................... 8 2.4 套接字通信 ............................................ 9 3 规划设计 ................................................ 13 3.1 课题来源 ............................................. 13 3.2 需求分析 ............................................. 13 4 系统分析与设计方案 ...................................... 15 4.1 聊天系统的总体设计要点 ............................... 15 4.2 聊天系统的设计步骤 ................................... 15 4.3 聊天系统各功能模块 ................................... 16 5 系统设计环境与测试 ...................................... 43 5.1 开发环境工具 ......................................... 43 5.2 硬件环境 ............................................. 44 5.3 网站功能模块的测试 ................................... 44 6 总结 .................................................... 52 6.1 毕业设计总结和展望 ................................... 52 6.2 经验和感想 ........................................... 52

IV

河南理工大学本科生毕业设计(论文)说明书

致 谢 ..................................................... 54 参 考 文 献 ................................................ 55

V

河南理工大学本科生毕业设计(论文)说明书

1 前言

随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持,而聊天室是人们最常见,最直接的网上交流的方式。

本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,且具有脱离数据库技术方法,易于维护和更新,这种技术程序由JAVA, 套接字通信socket组合而成,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。

1

河南理工大学本科生毕业设计(论文)说明书

2 概论

2.1 JAVA的网络功能与编程

2.1.1 JAVA概述

美国硅谷有一句行话,每10年~15年有一次轮回。最近的一次轮回就是从Java开始。

Java是一个由Sun公司开发而成的新一代编程语言。使用它可在各式各样不同种机器、不同种操作平台的网络环境中开发软件。不论你使用的是哪一种WWW浏览器,哪一种计算机,哪一种操作系统,只要WWW浏览器上面注明了“支持Java”,你就可以看到生动的主页。Java正在逐步成为Internet应用的主要开发语言。它彻底改变了应用软件的开发模式,带来了自PC机以来又一次技术革命,为迅速发展的信息世界增添了新的活力。

Java带来的影响:Java虽出现的时间不长,但已被业界接受,IBM、Apple、DEC、Adobe、SiliconGraphics、HP、Oracle、Toshiba、Netscap和Microsoft等大公司已经购买了Java的许可证。Microsoft还在其Web浏览器Explorer3.0版中增加了对Java的支持。另外,众多的软件开发商也开发了许多支持Java的软件产品。在以网络为中心的计算时代,不支持HTML和Java,就意味着应用程序的应用范围只能限于同质的环境。

Java的出现是计算机信息交换的一个重要里程碑。在单机时代,程序进程之间靠共享存储进行变量交换;在网络时代,运行在不同宿主机上的程序按网络协议进行无格式的消息(二进制字符流)交换,消息的语义由交换程序双方维护;在Java时代,运行在网络上的程序进程交换的是小应用程序(applet)。小应用程序是什么?它是一个对象,由一组属性和

2

河南理工大学本科生毕业设计(论文)说明书

方法构成,是一个可执行的实体;不仅有数据的状态,而且有定义在数据上的操作。未来可能进行代表(Agent)交换,代理有一定的智能性,那便是信息交换的更高级阶段。

2.1.2 JAVA的特点

(1)JAVA的主要特点

Java语言有下面一些特点:简单、面向对象、分布式、解释执行、鲁棒、 安全、体系结构中立、可移植、高性能及多线程。

①.简单性:Java语言是一种面向对象的语言,它通过提供最基本的方法来完成指定的任务,只需理解一些基本的概念,就可以用它编写出适合于各种情况的应用程序。

②.面向对象:Java语言的设计集中于对象及其接口,它提供了简单的类机制以及动态的接口模型。对象中封装了它的状态变量以及相应的方法,实现了模块化和信息隐藏;而类则提供了一类对象的原型,并且通过继承机制,子类可以使用父类所提供的方法,实现了代码的复用。 ③.分布性:Java是面向网络的语言。通过它提供的类库可以处理TCP/IP协议,用户可以通过URL地址在网络上很方便地访问其它对象。 ④.鲁棒性:Java在编译和运行程序时,都要对可能出现的问题进行检查,以消除错误的产生。它提供自动垃圾收集来进行内存管理,防止程序员在管理内存时容易产生的错误。另外, Java在编译时还可捕获类型声明中的许多常见错误,防止动态运行时不匹配问题的出现。

⑤.安全性:用于网络、分布环境下的Java必须要防止病毒的入侵。Java不支持指针,一切对内存的访问都必须通过对象的实例变量来实现,这样就防止程序员使用“特洛伊”木马等欺骗手段访问对象的私有成员,同时也避免了指针操作中容易产生的错误。

⑥.体系结构中立:Java解释器生成与体系结构无关的字节码指令,只要安装了Java运行时系统,Java程序就可在任意的处理器上运行。

3

河南理工大学本科生毕业设计(论文)说明书

⑦.可移植性:与平台无关的特性使Java程序可以方便地被移植到网络上的不同机器。同时,Java的类库中也实现了与不同平台的接口,使这些类库可以移植。另外,Java编译器是由Java语言实现的,Java运行时系统由标准C实现,这使得Java 系统本身也具有可移植性。 ⑧.解释执行:Java解释器直接对Java字节码进行解释执行。字节码本身携带了许多编译时信息,使得连接过程更加简单。

⑨.高性能:和其它解释执行的语言如BASIC不同,Java字节码的设计使之能很容易地直接转换成对应于特定CPU的机器码,从而得到较高的性能。

⑩.多线程:多线程机制使应用程序能够并行执行,而且同步机制保证了对共享数据的正确操作。通过使用多线程,程序设计者可以分别用不同的线程完成特定的行为,而不需要采用全局的事件循环机制,这样就很容易地实现网络上的实时交互行为。

(2)JavaApplet Java语言的特性使它可以最大限度地利用网络。 Applet是Java的小应用程序,它是动态、安全、跨平台的网络应用程序。JavaApplet嵌入HTML语 言,通过主页发布到Internet。网络用户访问服务器的Applet时,这些Applet从网络上进行传输,然后在支持Java的浏览器中运行。由于Java语言的安全机制,用户一旦载入Applet,就可以放心地来生成多媒体的用户界面或完成复杂的计算而不必担心病毒的入侵。

(3)丰富的类库Java提供了大量的类以满足网络化、多线程、面向对象系统的需要。

①.语言包提供的支持包括字符串处理、多线程处理、例外处理、数学函数处理等,可以用它简单地实现Java程序的运行平台。

②.实用程序包提供的支持包括哈希表、堆栈、可变数组、时间和日期等。

4

河南理工大学本科生毕业设计(论文)说明书

③.输入输出包用统一的\流\模型来实现所有格式的I/O,包括文件系统、网络、输入等。

④.低级网络包用于实现Socket编程。

⑤.抽象图形用户接口包实现了不同平台的计算机的图形用户接口部件,包括窗口、菜单、滚动条、对话框等,使得Java可以移植到不同平台的机器。

⑥.网络包支持Internet的TCP/IP协议,提供了与In-ternet的接口。它支持URL连接,WWW的即时访问,并且简化了用户/服务器模型的程序设计。

(4)Java和C、C++对于变量声明、参数传递、操作符、流控制等,Java使用了和C、C++相同的传统,使得熟悉C、C++的程序员能很方便地进行编程。同时,Java为了实现其简单、鲁棒、安全等特性,也摒弃了C和C++中许多不合理的内容。如:

①.全局变量:Java程序中,不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。

②.Goto:Java不支持C、C++中的goto语句,而是通过例外处理语句try, Catch, final等来代替C、C++中用goto来处理遇到错误时跳转的情况,使程序更可读且更结构化。

③.指针:指针是C、C++中最灵活,也是最容易产生错误的数据类型。Java对指针进行完全的控制,程序员不能直接进行任何指针操作,例如把整数转化为指针,或者通过指针释放某一内存地址等。同时,数组作为类在Java中实现,良好地解决了数组访问越界这一C、C++中不作检查的错误。 ④.内存管理:在Java中,所有的数据结构都是对象,通过运算符new为它们分配内存堆。通过new得到对象的处理权,而实际分配给对象的内存可能 随程序运行而改变,Java对此自动地进行管理并且进行垃圾收集,有效防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。

5

河南理工大学本科生毕业设计(论文)说明书

⑤.数据类型的支持:在Java中,对于这些数据类型总是分配固定长度的位数,如对int型,它总占32位,这就保证了Java的平台无关性。

2.1.3 JAVA语言在网络上的应用

Java程序可以获取网络上结点的图象、声音、HTML文档及文本等资源,并可以对获得的资源进行处理。例如Java程序可以每隔一定时间读取某结点提供的最新数据,并以图表的形式显示出来。在编程处理上,一般先生成一个URL类型的对象,然后用Java中相应的方法(method)获取该对象所代表的资源。下面列举一个Java从网络上获取图象的的方法以说明。

Java Applet可以直接从网络上结点获取图象并显示出来,Java提供了如下方法可以创建对应于其他结点的图象:

getImage(new URL(字符串)) 其使用格式可有两种:

String url = “结点URL”; Image image; try {

image = getImage(new URL(url));

}

catch(Exception e){

System.out.println(“Can’t open the URL “); } 或

URL imgur=null; Image image; try {

imgur=new URL(“结点URL “); }

catch (MalformedURLException e) {

System.out.println(“Can’t open the URL “); }

6

河南理工大学本科生毕业设计(论文)说明书

image=getImage(imgur);

前一种格式用“new URL(url)”生成 URL 对象, 并直接作为getImage的参数,后一种格式先用“new URL(url)”生成一个 URL对象,再传给getImage,两种格式本质上是一样。

以上仅是Java在客户端应用的一些方面,目前,Java更广泛的应用是在服务器端。

2.2 数据报通信常识

虽然TCP协议提供了有序的、可预测和可靠的信息包数据流,但是这样做的代价也很大,TCP包含很多在拥挤的网络中处理拥塞控制的复杂算法以及信息丢失的预测,这导致了这样传输数据的方式效率很差。因此,数据报通信方式是一种可选的替换方法。

数据报通信协议UDP(Unreiable Datagram Protocol)是一种非面向连接的提供不可靠的数据包式的数据传输协议,类似于从邮局发送信件的过程,信件只要放到邮箱就算完成任务。这说明了一旦数据报被释放给它们预定的目标,不保证他们一定到达目的地,甚至不保证一定存在数据的接收者。同样,数据报被接受时,不保证它在传输过程不受损坏,不保证发送它的机器仍在等待响应。此外,数据报传输有大小限制,每个传输的数据包必须限定在64KB之内。

Java通过DatagramPacket和DatagramSocket两个类实现UDP协议顶层的数据报。DatagramPacket生成的对象表示一个数据报,而DatagramSocket是用来发送和接受数据包的类。

对于DatagramPacket的内部状态,可以用如下方法获得。这些方法对数据包的目标地址和端口号以及原始数据和数据长度有完全的使用权。 DatagrameSocket类用来发送和接受数据包。因此,在用数据报方式编写客户端/服务器端程序时,无论是在客户端还是服务器端,首先需要建

7

河南理工大学本科生毕业设计(论文)说明书

立DatagrameSocket对象,用来接收或发送数据报,然后使用DatagramPacket类对象作为传输数据的载体。

通常,DatagramSocket接受数据报要用receive(DatagramPacket p)方法,而发送数据报则使用send(DatagramPacket p)方法,这两个方法是DatagramPacket十分常用的方法。

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

2.3 URL与URLConnection

URL的全称是Unitform Resourse Locator,意思是统一资源定位器,表示的是Internet上某一资源的地址,通过URL可以访问Internet上主机所开放的资源。URL由协议名和资源名组成,中间用“:”分隔。

Java中的URL类中有许多构造函数,这些构造函数会抛出MalformedURLException非运行是异常,在生成URL对象时必须进行异常处理。URLConnection是一个抽象类,代表与URL指定数据源动态连接,URLCon- nection类提供比URL类更强的服务器交互控制。如果你建立了与远程服务器之间的连接,你可以在传输它到本地之前用URLConnection来检查远程对象的属性。这些属性为HTTP协议的规范定义,并且仅对用HTTP协议的URL对象有意义。同时,它允许用POST或PUP和其他HTTP请求方法将数据送回服务器。在java.net包中只有抽象的URLConnection类,其中的许多方法和字段与单个构造函数一样是受保护的,这些方法只可以被URLConnection类及其子类访问。

当创建URLConnection对象后,我们可以使用URLConnection对象

8

河南理工大学本科生毕业设计(论文)说明书

的操作方法。如果URL类的构造函数的参数有问题,比如字符内容不符合URL位置表示法的规定、指定的传输协议不是Java所能接受时,那么构造函数就会抛出Mal- formedURLException异常,所以一定要用try和catch语句处理。

URLURL与URLConnection也是比较常用的两个类,它们主要用于访问Int- ernet上的运用资源。

2.4 套接字通信

Socket,简称套接字,用于实现网络上客户和服务器之间的连接。也就是说网络上两个或两个以上双工方式通信的进程之间总有一个连接,这个连接的端点成为套接字,套接字是在比较低的层次上通信的。

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

Socket程序的工作过程:

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

(2)数据通信:利用虚拟连接通道传送数据信息进行通道。 (3)关闭:通信结束时,再将所建的虚拟连接拆除。

具体如下:

9

河南理工大学本科生毕业设计(论文)说明书

1服务器

4接收 5读 6写 7关闭 7关闭 6 写 5 读 2监听 3客户端socketsocket 图2-1 Socket程序的工作过程

三次握手的内容:

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

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

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

具体过程如下:

10

河南理工大学本科生毕业设计(论文)说明书

第一次握手,主机A向主机B发送连接请求 ACK=1 第二次握手,主机B收到主机A的请求,向主机A回发一个确认,,同时向主机A发送一个连接请求 主机A 主机B

图2-2 三次握手

SYN=1,SEQ=0 ACK=1,SYN=1,SEQ=0 第三次握手,主机A收到主机B发送的数据包在向主机B发送一个确认连接 (1)套接字客户端:

所谓的客户端/服务器。是一种能够在基于网络环境的分布处理过程中,使用基于连接的网络通信模型。该通信模型首先在客户机和服务器之间定义一套通信协议,并创建一个Socket类,利用这个类来建立一条可靠的链接;然后,客户端/服务器再在这条连接上可靠地传输数据。客户端发出请求,服务器监听来自客户机的请求,为客户端提供响应服务。 利用Socket类,我们可以轻松地实现网络客户端程序的编写。通常能够情况下,客户端只要能够顺序地处理服务器程序的响应就可以了,因此客户端程序通常不用使用多线程。

(2)套接字服务端:

要实现套接字的服务端,需要使用ServerSocket类。ServerSocket类是服务器程序的运行基础,它允许程序绑定一个端口等待客户端的请求,一旦产生客户端请求,它就接受这一请求,同时产生一个完整的Socket连接对象。服务器绑定的端口号必须公开,以便让客户端程序知道如何连接这个服务器。同时,作为服务器,他必须能够接收多个客户的请求,这就需要为服务器设置一个请求队列,如果服务器不能马上响应客户端的请求,

11

河南理工大学本科生毕业设计(论文)说明书

要将这个请求放进请求队列中,等服务器将当前的请求处理完,会自动到请求队列中按照先后顺序取出请求进行处理。服务器的资源是有限的,这就导致它的最大连接数是有限的,通过ServerSocket的构造函数可以指定这个最大连接数。如果不明确指定这个连接数,默认最大连接数为50,也就是说,客户端的请求队列最大能容纳50个请求,当超过了这个最大连接数时,用户的请求将不再会被响应。

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

12

河南理工大学本科生毕业设计(论文)说明书

3 规划设计

3.1 课题来源

根据当前网络的需求,网络聊天越来越受各种网民所青睐。因此开发网络聊天是相当有必要,而且在网站内增加聊天功能,它不仅可以提高网站的访问量,同时可以留着访客,更重要的是让访客透过聊天室实时的互相交流。而本人也学习过JAVA语言,对网络编程也较有兴趣,为了更好的考验自己对JAVA语言的掌握程度,本人就决定以《Java聊天室》为毕业设计,希望通过这一次能进一步提高本人的网络开发编程的能力。

3.2 需求分析

利用Java实现基于C/S模式的聊天程序,聊天系统不外乎两个方面,服务器端和客户端。服务器端程序主要负责侦听客户端发来的消息,客户端需登录到服务端才可以实现正常的聊天功能。简单分析一下两个方面所要完成的任务,对设计这个程序来说,等于完成了一半。首先来看一下服务器端的任务:

服务器端的主要功能如下:

(1)在特定端口上进行侦听,等待客户端连接。

(2)用户可以配置服务端的侦听端口,默认端口为8888。 (3)向已经连接到服务端的用户发送系统消息。 (4)统计在线人数。

(5)当停止服务时,断开所有的用户连接。

以上就是服务器端最主要任务。不难看出,服务器端的任务并不复杂。 客户端的主要功能如下:

13

河南理工大学本科生毕业设计(论文)说明书

(1)连接到已经开启服务的服务端。

(2)用户可以配置要连接服务器端的IP地址与端口号。 (3)用户可以配置连接后显示的用户名。

(4)当服务器端开启的话,用户可以随时登录与注销。 (5)用户可以向所有人或某一个人发送消息。

相对服务器而言,客户端的任务也不很复杂,有了以上的简单分析,可以知道,解决上述问题,即完成了该聊天系统的核心。

14

河南理工大学本科生毕业设计(论文)说明书

4 系统分析与设计方案

4.1 聊天系统的总体设计要点

聊天系统的设计跟普通网站设计有着许多不同的地方,普通网站设计所考虑的因素,例如,普通网站需要对布局进入大量美化以及动画设计等等,而聊天室只要提供满足访客双方直接实时聊天即可。因此,在设计聊天系统的过程中,必须要考虑好以下几个设计要点:

(1)实现思想

在Internet上的聊天程序一般都是以服务器提供服务端连接响应,使用者通过客户端程序登录到服务器,就可以与登录在同一服务器上的用户交谈,这是一个面向连接的通信过程。因此,程序要在TCP/IP环境下,实现服务器端和客户端两部分程序。

(2)服务器端工作流程

服务器端通过socket()系统调用创建一个Socket数组后(即设定了接受连接客户的最大数目),与指定的本地端口绑定bind(),就可以在端口进行侦听listen()。如果有客户端连接请求,则在数组中选择一个空Socket,将客户端地址赋给这个Socket。然后登录成功的客户就可以在服务器上聊天了。

(3)客户端工作流程

客户端程序相对简单,只需要建立一个Socket与服务器端连接,成功后通过这个Socket来发送和接收数据就可以了。

4.2 聊天系统的设计步骤

(1)聊天系统工作原理图

15

河南理工大学本科生毕业设计(论文)说明书

图4-1 聊天系统工作原理图

(2)聊天系统设计步骤如下:

①.首先搜集一定的相关资料,根据自己的构思设计出理想的界面(服务器端界面和客户端界面);

②.构思玩界面的设计后,根据所要实现的功能编写相应的代码; ③.编写完代码后,就应该进入调试运行阶段; ④.运行无误后,此系统就大功告成。

4.3 聊天系统各功能模块

(1)服务器程序模块

服务器与客户间通过套接口Socket(TCP)连接。在java中使用套接口相当简单,Java API为处理套接口的通信提供了一个类java.net.Socket,使得编写网络应用程序相对容易。服务器采用多线程以满足多用户的请求,并通过创建一个ServerSocket对象来监听来自客户的连接请求,默认端口为8888,然后无限循环调用accept()方法接受客户程序的连接。

服务器端程序流程图如图4-2:

16

河南理工大学本科生毕业设计(论文)说明书

图4-2 服务器端程序流程图

代码如下: import java.awt.*; import java.awt.event.*; import javax.swing.*;

import javax.swing.JOptionPane; import javax.swing.event.*; import java.net.*;

17

河南理工大学本科生毕业设计(论文)说明书

import java.io.*;

public class ChatServer extends JFrame implements ActionListener{ public static int port=8888;//服务器的侦听端口 ServerSocket serverSocket;//服务端Socket Image icon;//程序图标 JComboBox combobox; JTextArea messageShow; JScrollPane messageScrollPane; JTextField showStatus;

JLabel sendToLabel,messageLabel; JTextField sysMessage; JButton sysMessageButton; UserLinkList userLinkList;

JMenuBar jMenuBar=new JMenuBar(); JMenu serviceMenu=new JMenu(\服务(V)\ JMenuItem portItem=new JMenuItem(\端口设置(P)\ JMenuItem startItem=new JMenuItem(\启动服务(S)\ JMenuItem stopItem=new JMenuItem(\停止服务(T)\ JMenuItem exitItem=new JMenuItem(\退出(X)\ JMenu helpMenu=new JMenu(\帮助(H)\ JMenuItem helpItem=new JMenuItem(\帮助(H)\ JToolBar toolBar=new JToolBar(); JButton portSet; JButton startServer; JButton stopServer; JButton exitButton;

Dimension faceSize=new Dimension(500,700);

18

河南理工大学本科生毕业设计(论文)说明书

ServerListen listenThread; JPanel downPanel; GridBagLayout gridBag; GridBagConstraints gridBagCon; public ChatServer(){ init();

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack();

this.setSize(faceSize);

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int)(screenSize.width-faceSize.getWidth())/2,(int)(screenSize.height-faceSize.getHeight())/2); this.setResizable(false); this.setTitle(\聊天室服务端\ icon=getImage(\ this.setIconImage(icon); //show(); setVisible(true);

serviceMenu.setMnemonic('V'); portItem.setMnemonic('P');

portItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK)); startItem.setMnemonic('s');

startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK)); stopItem.setMnemonic('T');

stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputE

19

河南理工大学本科生毕业设计(论文)说明书

vent.CTRL_MASK)); exitItem.setMnemonic('X');

exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK)); helpMenu.setMnemonic('H'); helpItem.setMnemonic('H');

helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK)); }

public void init() {

Container contentPane=getContentPane(); contentPane.setLayout(new BorderLayout()); serviceMenu.add(portItem); serviceMenu.add(startItem); serviceMenu.add(stopItem); serviceMenu.add(exitItem); jMenuBar.add(serviceMenu); helpMenu.add(helpItem); jMenuBar.add(helpMenu); setJMenuBar(jMenuBar); portSet=new JButton(\端口设置\ startServer=new JButton(\启动服务\ stopServer=new JButton(\停止服务\ exitButton=new JButton(\退出\ toolBar.add(portSet); toolBar.addSeparator(); toolBar.add(startServer);

20

河南理工大学本科生毕业设计(论文)说明书

toolBar.add(stopServer); toolBar.addSeparator(); toolBar.add(exitButton);

contentPane.add(toolBar,BorderLayout.NORTH); stopServer.setEnabled(false); stopItem.setEnabled(false); portItem.addActionListener(this); startItem.addActionListener(this); stopItem.addActionListener(this); exitItem.addActionListener(this); helpItem.addActionListener(this); portSet.addActionListener(this); startServer.addActionListener(this); stopServer.addActionListener(this); exitButton.addActionListener(this); combobox=new JComboBox(); combobox.insertItemAt(\所有人\ combobox.setSelectedIndex(0); messageShow=new JTextArea(); messageShow.setEditable(false); messageScrollPane=new

JScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED); messageScrollPane.setPreferredSize(new Dimension(400,400)); messageScrollPane.revalidate(); showStatus=new JTextField(35); showStatus.setEditable(false);

21

河南理工大学本科生毕业设计(论文)说明书

sysMessage=new JTextField(23); sysMessage.setEnabled(false); sysMessageButton=new JButton(); sysMessageButton.setText(\发送\ sysMessage.addActionListener(this); sysMessageButton.addActionListener(this); sendToLabel=new JLabel(\发送至:\ messageLabel=new JLabel(\发送消息:\ downPanel=new JPanel(); gridBag=new GridBagLayout(); downPanel.setLayout(gridBag); gridBagCon=new GridBagConstraints(); gridBagCon.gridx=0; gridBagCon.gridy=0; gridBagCon.gridwidth=3; gridBagCon.gridheight=2; gridBagCon.ipadx=5; gridBagCon.ipady=5;

JLabel none=new JLabel(\ \ gridBag.setConstraints(none,gridBagCon); downPanel.add(none);

gridBagCon=new GridBagConstraints(); gridBagCon.gridx=0; gridBagCon.gridy=2;

gridBagCon.insets=new Insets(1,0,0,0); gridBagCon.ipadx=5; gridBagCon.ipady=5;

22

河南理工大学本科生毕业设计(论文)说明书

gridBag.setConstraints(sendToLabel,gridBagCon); downPanel.add(sendToLabel);

gridBagCon=new GridBagConstraints(); gridBagCon.gridx=1; gridBagCon.gridy=2;

gridBagCon.anchor=GridBagConstraints.LINE_START; gridBag.setConstraints(combobox,gridBagCon); downPanel.add(combobox);

gridBagCon=new GridBagConstraints(); gridBagCon.gridx=0; gridBagCon.gridy=3;

gridBag.setConstraints(messageLabel,gridBagCon); downPanel.add(messageLabel); gridBagCon=new GridBagConstraints(); gridBagCon.gridx=1; gridBagCon.gridy=3;

gridBag.setConstraints(sysMessage,gridBagCon); downPanel.add(sysMessage);

gridBagCon=new GridBagConstraints(); gridBagCon.gridx=2; gridBagCon.gridy=3;

gridBag.setConstraints(sysMessageButton,gridBagCon); downPanel.add(sysMessageButton); gridBagCon=new GridBagConstraints(); gridBagCon.gridx=0; gridBagCon.gridy=4; gridBagCon.gridwidth=3;

23

河南理工大学本科生毕业设计(论文)说明书

gridBag.setConstraints(showStatus,gridBagCon); downPanel.add(showStatus);

contentPane.add(messageScrollPane,BorderLayout.CENTER); contentPane.add(downPanel,BorderLayout.SOUTH); this.addWindowListener( new WindowAdapter(){

public void windowClosing(WindowEvent e){ stopService(); System.exit(0); } } ); } /**

* 事件处理 */

public void actionPerformed(ActionEvent e) { Object obj=e.getSource();

if (obj==startServer || obj==startItem) { startService(); }

else if(obj==stopServer || obj==stopItem) {

int j=JOptionPane.showConfirmDialog(this,\真的停止服务吗?\停止服务\ if(j==JOptionPane.YES_OPTION) { stopService(); }

24

河南理工大学本科生毕业设计(论文)说明书

}

else if(obj==portSet||obj==portItem) { PortConf portConf=new PortConf(this); //portConf.show(); portConf.setVisible(true); }

else if (obj==exitButton||obj==exitItem) {

int j=JOptionPane.showConfirmDialog(this,\真的要退出吗?\退出\ if(j==JOptionPane.YES_OPTION) { stopService(); System.exit(0); } }

else if(obj==helpItem){

Help helpDialog=new Help(this); helpDialog.setVisible(true); }

else if (obj==sysMessage || obj==sysMessageButton){ sendSystemMessage(); } }

public void startService(){ try{

serverSocket=new ServerSocket(port,10);

messageShow.append(\服务端已经启动,在\端口侦听...\\n\

startServer.setEnabled(false);

25

河南理工大学本科生毕业设计(论文)说明书

startItem.setEnabled(false); portSet.setEnabled(false); portItem.setEnabled(false); stopServer.setEnabled(true); stopItem.setEnabled(true); sysMessage.setEnabled(true); }

catch(Exception e){ //System.out.println(e); }

userLinkList=new UserLinkList(); listenThread=new

ServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList)

listenThread.start(); }

public void stopService(){ try{

sendStopToAll(); listenThread.isStop=true; serverSocket.close();

int count=userLinkList.getCount(); int i=0; while(i

Node node=userLinkList.findUser(i); node.input.close(); node.output.close();

26

河南理工大学本科生毕业设计(论文)说明书

node.socket.close(); i++; }

stopServer.setEnabled(false); stopItem.setEnabled(false); startServer.setEnabled(true); startItem.setEnabled(true); portSet.setEnabled(true); portItem.setEnabled(true); sysMessage.setEnabled(false);

messageShow.append(\服务端已经关闭\\n\ combobox.removeAllItems(); combobox.addItem(\所有人\ }

catch(Exception e){ //System.out.println(e); } }

public void sendStopToAll(){

int count=userLinkList.getCount(); int i=0; while(i

Node node=userLinkList.findUser(i); if(node==null){ i++; continue; }

27

河南理工大学本科生毕业设计(论文)说明书

try{

node.output.writeObject(\服务关闭\ node.output.flush(); }

catch(Exception e){

//System.out.println(\ } i++; } }

public void sendMsgToAll(String msg){ int count=userLinkList.getCount(); int i=0; while(i

Node node=userLinkList.findUser(i); if(node==null){ i++; continue; } try{

node.output.writeObject(\系统信息\ node.output.flush();

node.output.writeObject(msg); node.output.flush(); }

catch (Exception e){

//System.out.println(\

28

河南理工大学本科生毕业设计(论文)说明书

} i++; }

sysMessage.setText(\}

public void sendSystemMessage(){

String toSomebody=combobox.getSelectedItem().toString(); String message=sysMessage.getText()+\ messageShow.append(message);

if(toSomebody.equalsIgnoreCase(\所有人\ sendMsgToAll(message); } else{

Node node=userLinkList.findUser(toSomebody); try{

node.output.writeObject(\系统信息\ node.output.flush();

node.output.writeObject(message); node.output.flush(); }

catch (Exception e){

//System.out.println(\ }

sysMessage.setText(\ } }

29

河南理工大学本科生毕业设计(论文)说明书

Image getImage(String filename) { URLClassLoader

urlLoader=(URLClassLoader)this.getClass().getClassLoader(); URL url=null; Image image=null;

url=urlLoader.findResource(filename);

image=Toolkit.getDefaultToolkit().getImage(url); MediaTracker mediatracker=new MediaTracker(this); try{

mediatracker.addImage(image,0); mediatracker.waitForID(0); }

catch (InterruptedException _ex) { image=null; }

if(mediatracker.isErrorID(0)) { image=null; }

return image; }

public static void main (String[] args) { ChatServer app=new ChatServer(); } }

(2)客户程序模块

客户通过Socket(InetAddress,port)建立与服务器的连接。服务器与客户都通过构造BufferedReader,PrintWriter来建立输入输出流,然后双方通

30

河南理工大学本科生毕业设计(论文)说明书

过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,比如文件传输等,服务器收到来自客户的请求后,针对不同的消息处理请求。

客户端程序流程图如图4-3:

图4-3 客户端程序流程图

程序如下:

import java.awt.*;

import java.awt.event.*; import javax.swing.*;

import javax.swing.event.*; import java.io.*; import java.net.*;

public class ChatClient extends JFrame implements ActionListener{ String ip=\

31

河南理工大学本科生毕业设计(论文)说明书

int port=8888;

String userName=\匆匆过客\ int type=0; Image icon;

JComboBox combobox; JTextArea messageShow;

JScrollPane messageScrollPane;

JLabel express,sendToLabel,messageLabel; JTextField clientMessage; JCheckBox checkbox; JComboBox actionlist;

JButton clientMessageButton; JTextField showStatus; Socket socket;

ObjectOutputStream output; ObjectInputStream input; ClientReceive recvThread;

JMenuBar jMenuBar=new JMenuBar();

JMenu operateMenu=new JMenu(\操作(O)\

JMenuItem loginItem=new JMenuItem(\用户登录(I)\ JMenuItem logoffItem=new JMenuItem(\用户注销(L)\ JMenuItem exitItem=new JMenuItem(\退出(X)\ JMenu conMenu=new JMenu(\设置(C)\

JMenuItem userItem=new JMenuItem(\用户设置(U)\ JMenuItem connectItem=new JMenuItem(\连接设置(C)\ JMenu helpMenu=new JMenu(\帮助(H)\

JMenuItem helpItem=new JMenuItem(\帮助(H)\ JToolBar toolBar=new JToolBar(); JButton loginButton; JButton logoffButton; JButton userButton; JButton connectButton; JButton exitButton;

Dimension faceSize=new Dimension(500,700); JPanel downPanel;

GridBagLayout gridBag;

GridBagConstraints gridBagCon; public ChatClient() {

32

河南理工大学本科生毕业设计(论文)说明书

init();

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack();

this.setSize(faceSize);

Dimension screenSize=Toolkit.getDefaultToolkit().getScreenSize(); this.setLocation((int)(screenSize.width-faceSize.getWidth())/2,(int)

(screenSize.height-faceSize.getHeight())/2);

this.setResizable(false);

this.setTitle(\聊天室客户端\ icon=getImage(\ this.setIconImage(icon); //show();

setVisible(true);

operateMenu.setMnemonic('O'); loginItem.setMnemonic('I');

loginItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_I,InputEvent.CTRL_MASK));

logoffItem.setMnemonic('L');

logoffItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_L,InputEvent.CTRL_MASK));

exitItem.setMnemonic('X');

exitItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));

conMenu.setMnemonic('C'); userItem.setMnemonic('U');

userItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));

connectItem.setMnemonic('C');

connectItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));

helpMenu.setMnemonic('H'); helpItem.setMnemonic('H');

helpItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK)); }

public void init(){

Container contentPane=getContentPane();

33

河南理工大学本科生毕业设计(论文)说明书

contentPane.setLayout(new BorderLayout());

operateMenu.add(loginItem); operateMenu.add(logoffItem); operateMenu.add(exitItem); jMenuBar.add(operateMenu); conMenu.add(userItem); conMenu.add(connectItem); jMenuBar.add(conMenu); helpMenu.add(helpItem); jMenuBar.add(helpMenu); setJMenuBar(jMenuBar);

loginButton=new JButton(\登录\ logoffButton=new JButton(\注销\ userButton=new JButton(\用户设置\ connectButton=new JButton(\连接设置\ exitButton=new JButton(\退出\

loginButton.setToolTipText(\连接到指定的服务器\ logoffButton.setToolTipText(\与服务器断开连接\ userButton.setToolTipText(\设置用户信息\

connectButton.setToolTipText(\设置所要连接到的服务器信息\ toolBar.add(userButton); toolBar.add(connectButton); toolBar.addSeparator(); toolBar.add(loginButton); toolBar.add(logoffButton); toolBar.addSeparator(); toolBar.add(exitButton);

contentPane.add(toolBar,BorderLayout.NORTH); checkbox=new JCheckBox(\悄悄话\ checkbox.setSelected(false); actionlist=new JComboBox(); actionlist.addItem(\微笑地\ actionlist.addItem(\高兴地\ actionlist.addItem(\轻轻的\ actionlist.addItem(\生气地\ actionlist.addItem(\小心地\ actionlist.addItem(\静静地\

34

河南理工大学本科生毕业设计(论文)说明书

actionlist.setSelectedIndex(0); loginButton.setEnabled(true); logoffButton.setEnabled(false); loginItem.addActionListener(this); logoffItem.addActionListener(this); exitItem.addActionListener(this); userItem.addActionListener(this); connectItem.addActionListener(this); helpItem.addActionListener(this); loginButton.addActionListener(this); logoffButton.addActionListener(this); userButton.addActionListener(this); connectButton.addActionListener(this); exitButton.addActionListener(this); combobox=new JComboBox(); combobox.insertItemAt(\所有人\ combobox.setSelectedIndex(0); messageShow=new JTextArea(); messageShow.setEditable(false); messageScrollPane=new

JScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

messageScrollPane.setPreferredSize(new Dimension(400,400)); messageScrollPane.revalidate(); clientMessage=new JTextField(23); clientMessage.setEnabled(false); clientMessageButton=new JButton(); clientMessageButton.setText(\发送\ clientMessage.addActionListener(this);

clientMessageButton.addActionListener(this); sendToLabel=new JLabel(\发送至:\

express=new JLabel(\ 表情: \ messageLabel=new JLabel(\发送消息:\ downPanel=new JPanel();

gridBag=new GridBagLayout(); downPanel.setLayout(gridBag);

gridBagCon=new GridBagConstraints(); gridBagCon.gridx=0;

35

本文来源:https://www.bwwdw.com/article/8ra7.html

Top