最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

Ichat 聊天系统文档

来源:动视网 责编:小OO 时间:2025-09-30 01:05:38
文档

Ichat 聊天系统文档

目录摘要IIAbstractIII第一章绪论11.1课题背景11.2目的与意义11.3开发工具简介21.4Socket的简介4第二章需求分析62.1系统的总体设计62.2系统需求分析62.3系统实现方案分析7第三章详细设计分析93.1服务器端详细说明93.2客户端详细说明103.3系统的实现原理15第四章设计结果及分析1.1服务器设计和实现164.2客户端设计和实现17总结19致谢20参考文献21摘要随着计算机网络技术的快速发展,人们的交流方式越来越多,网络聊天工具已经作为一种重要的信息交
推荐度:
导读目录摘要IIAbstractIII第一章绪论11.1课题背景11.2目的与意义11.3开发工具简介21.4Socket的简介4第二章需求分析62.1系统的总体设计62.2系统需求分析62.3系统实现方案分析7第三章详细设计分析93.1服务器端详细说明93.2客户端详细说明103.3系统的实现原理15第四章设计结果及分析1.1服务器设计和实现164.2客户端设计和实现17总结19致谢20参考文献21摘要随着计算机网络技术的快速发展,人们的交流方式越来越多,网络聊天工具已经作为一种重要的信息交
目 录

摘  要    II

Abstract    III

第一章 绪论    1

1.1课题背景    1

1.2目的与意义    1

1.3开发工具简介    2

1.4 Socket的简介    4

第二章  需求分析    6

2.1系统的总体设计    6

2.2系统需求分析    6

2.3系统实现方案分析    7

第三章 详细设计分析    9

3.1 服务器端详细说明    9

3.2 客户端详细说明    10

3.3 系统的实现原理    15

第四章  设计结果及分析    16

4.1 服务器设计和实现    16

4.2客户端设计和实现    17

总  结    19

致  谢    20

参考文献    21

摘  要

随着计算机网络技术的快速发展,人们的交流方式越来越多,网络聊天工具已经作为一种重要的信息交流工具,受到越来越多的网民的青睐。目前,出现了很多非常不错的聊天工具,其中应用比较广泛的有Netmeeting、腾讯QQ、MSN Messages等等,这些都是即时通信系统。同时,即时通信系统对现代企业也有着重大意义,它为各企业开拓了网络应用的新领域。自从它诞生以来,以实时交互、资费低廉等优点,受到广大个人用户的喜爱,已经成为网络生活中不可或缺的一部分。

该系统开发主要包括一个网络聊天服务器程序和一个网络聊天客户程序两个方面。前者通过Socket套接字建立服务器,服务器能读取、转发客户端发来信息,并能刷新用户列表。后者通过与服务器建立连接,来进行客户端与客户端的信息交流。其中用到了局域网通信机制的原理,通过直接继承Thread类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如TCP/IP协议、客户端/服务器端模式(Client/Server模式)、网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流的分析,包含了一些基本的软件工程的方法。该系统具有操作简单、界面友好、功能专一等特点。经过分析这些情况,该局域网聊天工具采用Eclipse为基本开发环境和java语言进行编写,首先可在短时间内建立系统应用原型,然后,对初始原型系统进行不断修正和改进,直到形成可行系统 。

关键词:客户端/服务器端模式;网络编程;Eclipse ;TCP/IP协议

Abstract

With the rapid development of computer network technology, more and more ways people communicate, network chat tool has been the exchange of information as an important tool by a growing number of Internet users of all ages. At present, there have been many very good chat tools, which are used widely in Net meeting, Tencent QQ, MSN Messages, etc., these are the instant messaging system. Meanwhile, the instant messaging system of modern enterprises is of great significance, it is for the companies to open up new areas of network applications. Since its inception, with real-time interaction, low tariffs, and so on, by the majority of individual users alike, the network has become an integral part of life.朗读

显示对应的拉丁字符的拼音

The system developed includes a chat server program and a network chat client both. The former established by Socket server, the server can read, forward, sent the client information, and can refresh the user list. The latter to establish a connection with the server to the client and client information exchange, Which uses a local area network communication mechanism works through the direct successor to the Thread class to create multiple threads. Development of computer network programming using the basic theoretical knowledge, such as TCP / IP protocol, client / server mode (Client / Server mode), web programming design methods. Network programming in reading the information, sending, is the use of flow to achieve the exchange of information, which describes the realization of a system of information flow analysis, including some basic software engineering methods. The system is simple, user-friendly, functional specificity and so on. After analysis of these cases, the local area network chat tool as the basic development environment using Eclipse and java language for writing, the first application in a short time to establish a prototype system, then, the initial prototype system constantly revised and improved, until the formation of a viable system. 

Keywords:client / server mode; network programming; Eclipse; TCP / IP protocol

第一章 绪论

随着互联网逐步普及,人们的生活和工作也越来越离不开信息网络的支持, 而聊天室是人们最常见, 最直接的网上交流的方式。本聊天系统以聊天交流为主,为广大用户提供一个借助网络进行人际交往的平台,也是网络与现实最贴近的实用型网站。本文所介绍的网络聊天系统是基于开放的JAVA应用程序开发设计的,其主要特性是能动态、实时的完成信息的传递,且具有高效的交互性,更有效的处理客户请求,易于维护和更新,其运行所需环境及其工作流程和各个功能控件的工作原理将在本文依次介绍,并且文中提供了部分程序源代码。

1.1课题背景

 随着Internet的普及和宽带技术的成熟,越来越多的用户进入到网络世界中享用浏览新闻,查询信息,发送邮件,在线观看电影等服务,享受网络带来的便利和办公的高效。然而,近年来,各种企业内部通讯系统得到了飞速发展,它可以不用连接Internet,直接在局域网内实现信息通讯、工作交流、提交计划等业务。这种通讯系统广泛应用于中小型企业的内部通讯,可以大大提高职工的工作效率,在方便企业内部职工交流的同时,也创造了一个安静的工作环境。在现代企业内部通讯软件是不可缺少的工具。

该项目的开发软件是IChat时实聊天系统软件,是鉴于有些单位不允许员工上班时网上聊天,故在局域网的出口网关上只开通80端口,这给一些工作时需要交流信息或传输文件的工作人员带来不便,他们很需要一个能在局域网内交流信息的聊天软件。此外还有现在大学生宿舍电脑的普及率很高,他们中有不少只接上了学校的局域网,而没有缴费上Internet网,因此他们也很需要一个局域网内的聊天软件来交流信息的背景下构思出来的,该软件完成后,可用于局域网内简单的聊天。

一般来说,聊天工具大多数由客户端程序和服务器端程序组成,但现有的大多数聊天工具只提供客户端程序,而不提供服务器程序,这样就无法灵活的用在一些机构的内部网络中。本系统的设计包括服务器程序和客户程序,可以灵活的用在一些机构的内部网络中,只要在内部网络的服务器上运行服务器程序,整个内部网上的所有用户都可以进行通信。

1.2目的与意义

在线聊天系统是互联网站一种极为常见的互动沟通交流服务。聊天系统可以向网友提供开放性的聊天服务,网友们可以在此互相发表自己的某些观感,交流某些技术,经验乃至人生的感悟与忧欢,结交更多的朋友,即经济又实惠。

这个聊天系统是模拟腾讯QQ的形式,由登录界面登录到好友列表,然后根据server端的端口号发送信息到指定的好友,可以用鼠标和键盘发送消息。这个程序很简单只实现了一对一和一对多的聊天。

在互联网上,传统的网站或用户都使用类似于Email(电子邮件)的形式互相发送信息来进行一系列的交流。但这种异步交互的办事效率可见是很低的。为提高效率,让用户之间能达到实时交互的目的,所以出现了可以实时交流信息的聊天室,来满足用户的需求。

现在,企业、机关、学校都建立起自己的局域网。在局域网中,虽然可以通过文件共享的方式网上聊天系统是为人们进行交流和联系提供的一个平台,利用现代的网络资源优势和技进行通讯,但单单使用者种方式,使很不方便的。首先,在局域网里的网上邻居,只能看到机器名,不清楚对方是谁,也不知道对方的机器中有何可以共享,而且当局域网内机器很多时,这种方式会更麻烦。于是,就想到做一个局域网的聊天工具,在局域网内,我们可以通过它实现局域网内方便的联络、进行文件传输、消息的发布、自己共享内容的简介等。在学校建立起校园网,可以方便同学之间、教师之间、师生之间相互的联络的作用。这样可以节约很多的资源,在学校这个大环境中,方便了同学之间联络感情,促进彼此的感情。也可以通过聊天系统与老师讨论问题。并能最大限度的使用资源,提高工作效率。为了能适应校园网的建设,并实现校园内的消息发布、学生交流、师生交流、网上作业等功能。

1.3开发工具简介

1.3.1 JAVA概述

Sun的Java语言开发小组成立于1991年,其目的是开拓消费类电子产品市场,例如,交互式电视、烤面包箱等。Sun内部人员把这个项目称为Green,那时WorldWideWeb还在图纸上呢。该小组的领导人是James Gosling,是一位非常杰出的程序员。他出生于1957年,于1984年加盟Sun Microsystem公司,之前在一家IBM研究机构工作。他是Sun NeWs窗口系统的总设计师。也是第一个用C实现的EMACS的文本编辑器COSMACS的开发者。

在研究开发过程中,Gosling深刻体会到消费类电子产品和工作站产品在开发哲学上的差异:消费类电子产品要求可靠性高、费用低、标准化、使用简单,用户并不关心CPU的型号,也不欣赏专用昂贵的RISC处理器,他们需要建立在一个标准基础之上,具有一系列可选的方案,从8086到80586都可以选取。从C开始为了使整个系统与平台无关,Gosling首先从改写C编译器着手。但是Gosling在改写过程中感到仅C是无法满足需要的,于是在1991年6月份开始准备开发一个新的语言,那么给它起一个什么名字呢?Gosling回首向窗外望去,看见一棵老橡树,于是建一个目录叫Oak,这就是Java语言的前身(后来发现Oak已是Sun公司另一个语言的注册商标,才改名为Java,即太平洋上一个盛产咖啡的岛屿的名字)。

Java的出现是计算机信息交换的一个重要里程碑。在单机时代,程序进程之间靠共享存储进行变量交换;在网络时代,运行在不同宿主机上的程序按网络协议进行无格式的消息(二进制字符流)交换,消息的语义由交换程序双方维护;在Java时代,运行在网络上的程序进程交换的是小应用程序(applet)。小应用程序是什么?它是一个对象,由一组属性和方法构成,是一个可执行的实体;不仅有数据的状态,而且有定义在数据上的操作。未来可能进行代表(Agent)交换,代理有一定的智能性,那便是信息交换的更高级阶段。

随着Internet的崛起、Java的诞生,巨型的、臃肿的应用软件开始向小型化发展,由众多“生活”在Internet上的小应用程序(applet)相互协作完成信息的处理与传递。Java会加速应用软件的小型化、网络化的趋势。随着Internet的发展,软件必然是面向“大众”,而不是“少数人”的奢侈品,薄利多销将是网络应用软件的重要特点。分布式对象技术保证了用多少,下载多少。 Java连同Internet,WWW正在改变应用软件的开发和使用方式,一切都要围绕着网络,围绕着平台无关。很多人认为,Word、Excel等传统的信息处理工具都必然走向萎缩,因为它们是单机时代的产物。信息的价值在于使用和共享,Internet和Web是信息的使用和共享最快捷、最便宜的方式,Word将演化成为Web写作工具,Excel则将演化成Web上的电子表格。

1.3.2 Java的特点

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

Java语言的特性使它可以最大限度地利用网络。Applet是Java的小应 用程序,它是动态、安全、跨平台的网络应用程序。JavaApplet嵌入HTML语言,通过主页发布到Internet。网络用户访问服务器的Applet时,这些Applet 从网络上进行传输,然后在支持Java的浏览器中运行。由于Java语言的安全机制,用户一旦载入Applet,就可以放心地来生成多媒体的用户界面或完成复杂的计算而不必担心病毒的入侵。虽然Applet可以和图像、声音、动画等一样从网络上下载,但它并不同于这些多媒体的文件格式,它可以接收用户的输入,动态 地进行改变,而不仅仅是动画的显示和声音的播放。

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

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

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

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

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

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

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

1.3.3 Java语言在网络上的应用

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

(1)IP、TCP协议的特点:

TCP/IP(Transmission Control Protocol/Internet Protocol)是传输控制协议/网际协议的缩写, TCP/IP是当今网络互联的核心协议。TCP/IP协议的体系结构共有四个层次,即应用层、传输层、网络互联层和网络接口层。

IP协议的作用:第一,它是网络层的协议,提供互联网上数据传输的统一格式。第二,提供不可靠的无连接的服务。第三,定义了互联网上的传输数据的基本单元,提供了供路由选择的信息,没有差错校验和处理的机制。

TCP协议的功能:差错控制——可靠性、面向连接、分段(Segment)、端口号。TCP是传输控制协议,是面向连接的提供了一种可靠的传输服务,它用三次握手和滑动窗口机制来保证传输的可靠性,及进行流量控制。

TCP/IP协议具有以下特点:

1.协议标准具有开放性,其于特定的计算机硬件及操作系统,可以免费使用。

2.统一分配网络地址,使得每个TCP/IP 设备在网络中都具有唯一的IP地址。

3.实现了高层协议的标准化,能为用户提供多种可靠的服务。

(2)TCP/IP协议进行传输数据传输的过程:

应用程序为了传输数据会调用TCP,将数据和对应的参数传给TCP,将TCP  数据包封装在IP包内,通过网络送给目的TCP。接收方TCP在接收到数据后通知上层应用程序,TCP将保证接收数据的正确性。在实现TCP的主机上,TCP可以被看成是一个模块,和文件系统区别不大,TCP 也可以调用一些操作系统的功能,TCP不直接和网络打交道,控制网络的任务由专门的设备驱动模块完成。TCP只是调用IP接口,向TCP提供所有TCP需要的服务。

(3)端口号:

有的时候,一个IP地址不能完整的标识一台服务器,这是应为一台物理性的计算机同时运行着多个应用程序,这就需要我们来区别同一台机子上的不同的服务,所以就在传输层和应用层上设置接口,就是 端口。端口实际是一个16位长的 地址,他的范围是0~65535之间,其中0~1023是熟知端口,主要是给提供服务的应用程序使用,这些端口是所有应用进程都只道的,1024~65535为一般端口,也称动态端口、连接端口,用来随时分配要求通信的客户端应用程序。在数据传输过程中,各种服务器不断的检测分配给他的端口,一边发现要求和他通信的客户端。

1.4 Socket的简介

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

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

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

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

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

图1.1 客户端与服务器 

三次握手:

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

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

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

第二章  需求分析

2.1系统的总体设计

要制作的聊天系统是一个简单、方便的通信系统,为两部分:服务器端和客户端。此聊天系统要可以方便用户之间进行交流,信息即时发送,即时回复。

服务器主要完成三大功能:建立连接、操作数据库和监听客户。服务器建立一个Server Socket的连接,不断侦听是否有客户端的连接或断开连接,如有客户端申请连接就启动一个线程与客户端建立连接并根据客户端的请求对数据进行操作并把结果返回给客户端。

客户端主要完成三大功能:用户登陆、查找好友和聊天通信功能。客户端申请与服务器建立连接,当客户端与服务器建立连接通道后就可以向服务器端发送用户登陆信息,还有客户端还支持查找好友和完成信息的编辑、发送和接受功能。

1.服务器端

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

2.客户端

客户通过Socket(InteretAddress,port)建立与服务器的连接。服务器与客户都通过构造ObjectInputStream, ObjectOutputStream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,比如注册,登录,查找好友等,服务器收到来自客户的请求后,针对不同的消息处理请求, 虽然UDP不可靠但是对于本系统可靠性并不太重要,而且UDP快速,所以客户间发送信息通过UDP。用户登录时通过类ServerSocket创建本地接受端口以及发送端口,通过取得的好友的IP地址来向好友发送消息(send(MessagePacket))和接受消息(receive(MessagePacket))。

2.2系统需求分析

任何聊天系统不外乎由服务器端和客户端两部分组成,本聊天系统也不例外也是由服务器端和客户端组成,其中服务器端主要是完成对数据库的操作、监听客户端、和建立连接三个部分既可,客户端则要完成用户的新建、用户的登陆、查找好友和聊天功能,这样就基本完成了系统功能模块,如图2.1所示的划分。

2.1系统的功能模块

2.3系统实现方案分析

2.3.1分析Socket在服务器端的开发流程

在服务器端程序中,Socket首先通过socket函数建立服务器端的socket,并通过bind设置socket所使用的服务器端IP地址及通信端口。带服务器端socket建立之后,则通过侦听表示服务器端应用程序开始侦听客户端的连接。当收到来自客户端的连接请求时,便通过accept建立与客户端的连接。

建立服务器Socket应用程序步骤如下:

1)建立服务器端的Socket,并且以此侦听来自客户端的连接请求。

2)当服务器段侦测到来自客户端的连接请求时,则接收此请求并建立客户端的Socket,该Socket将作为客户端连接及后续处理发送及接收数据的依据,至此则完成服务器与客户端的Socket通信连接。

3)处理根据客户端的信息,一般称为请求,可视为客户端的指令需求。

4)根据客户端传来的请求,服务器端需经过程序逻辑处理之后,发送回相对应的执行结果或错误信息至客户端。

5)当程序完成数据或命令的处理之后,便关闭Socket通信链接。

在传递数据上,服务器与客户端之间可通过read、get及send、write进行数据的接收和发送。当连接中断时,程序利用socket dispose关闭Socket并释放系统资源。

2.3.2分析Socket在客户端的开发流程

     客户端Socket应用程序与服务器端Socket应用程序的流程很相似,最大的差别在于:

1)服务器端Socket应用程序主要用于侦听及接收客户端的连接,而客户端Socket应用程序则用于尝试与服务器端建立连接。

2)客户端Socket应用程序发送信息指令至服务器端,并接收服务器端所返回的结果;而服务器端Socket应用程序则处理指令逻辑,并将结果或错误信息发送至客户端。

客户端应用程序首先通过socket函数建立客户端的socket,其主要目的是与指令的服务器端(指定主机的IP地址及通信端口号)建立连接,此操作由connect来完成。当服务器端收到connect的连接请求时,则由服务器端的accept建立此连接。

建立客户端Socket应用程序的步骤大致如下:

1)建立客户端的Socket,在建立时需指定欲连接服务器端的主机名称(或IP地址)与Internet服务的通信端口。

2)发送特定信息或指令至服务器端。

3)接收服务器端返回的执行结果或错误信息,并以特定格式显示。例如HTTP通信协议会通过HTML内容显示。

4)当客户端不需要服务器端的处理时,便关闭Socket通信连接。

在数据传递上,可利用read、get及send、write接收及发送数据。最后并通过closesocket关闭Socket连接。

2.3.3多线程设计的分析

虽然多任务操作系统能并发执行多个系统进程或者多个用户进程,从而大大提高了CPU资源的利用率,但这往往还不能满足用户进一步的需要,Java在语言级支持多线程的程序设计,这也是Java与C,PASCAL,FORTRUN等语言的重要区别之一。用户利用多线程的程序设计,能很容易做到“多件事情”的“同时”处理,这样用户可以在前台运行图形用户界面,还可以在后台进行繁琐的大量计算。

1)服务器端的多线程设计

因为服务器端需要和多个客户端同时进行通信,所以服务器端要用多线程设计,一旦服务器端发现一个新的客户端与之建立连接,就马上新建一个线程与该客户端进行通信。用多线程的好处在于可以同时处理多个通信连接,不会出现由于数据排队等待而发生的延迟或者丢失,可以很好的利用系统的性能。

服务器端为每一个连接着的客户建立一个线程,为了同时响应多个客户端,需设计一个主线程来启动服务器的多线程。主线程与进程结构类似,它在获得新的连接时生成一个线程来处理这个连接。线程调度速度快,占用资源少,可以共享进程空间中的数据,因此服务器的响应速度较快,且I/O吞吐量较大。

2)客户端的多线程设计

因为两个客户端能够各自独自通过UDP进行消息的接受和发送操作,所以客户端的多线程设计与服务器端的不同,客户端的多线程是用循环等待的方法来实现的。 

第三章 详细设计分析

3.1 服务器端详细说明

 图3.1所示服务器主要完成建立连接、操作数据库、监听客户的功能,其具体含义是,首先服务器建立一个Server Socket的连接,不断侦听是否有客户端要和服务器端连接或者断开连接,当有客户断要与服务器建立连接服务器立即创建一个新的线程与客户端建立连接,然后再对数据库做出相应的操作最后把结果返回给客户端,服务器端对数据库的操作包括录入用户信息、修改用户信息、查找好友数据库的资料以及添加好友到数据库等等,总之对数据库的操作也就是对数据库进行增、删、改、查操作。

图3.1 服务器端

3.1.1 服务器端的设计

服务器是用来与客户间通过套接口Socket(TCP)连接,然后传送信息的过程。在Java 中使用Java.net.Socket类包,使得编写网络应用程序相对容易.服务器采用多线程以满足多用户的请求,创建一个Server Socket对象来监听来自客户的连接请求,默认端口为8080,然后无限循环调用accept()方法接受客户程序的连接。代码如下:

public class MyServerFrame extends JFrame implements ActionListener {

    JPanel jp1;

    JButton jb1,jb2;

    public static void main(String[] args) {    

        MyServerFrame mysf=new MyServerFrame();

    }

        public MyServerFrame()

    {

        jp1=new JPanel();

        jb1=new JButton("启动服务器");

        jb1.addActionListener(this);

        jb2=new JButton("关闭服务器");

        jb2.addActionListener(this);

        jp1.add(jb1);

        jp1.add(jb2);

        this.add(jp1);

        this.setSize(500, 400);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setVisible(true);

    }

    public void actionPerformed(ActionEvent arg0) {

            if(arg0.getSource()==jb1)

        {

            new MyQqServer();

        }

        else

        {

            this.dispose();

        }

    }

}

3.2 客户端详细说明

客户通过Socket建立与服务器的连接。服务器与客户都通过构造objectInputStream, objectoutputStream来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,如图3.2所示。

发送请求

确认请求

建立通信

客户端                             服务器端

图3.2 TCP通信协议

3.2.1用户登录

在客户端,用户输入其号码和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始通过server读取数据库,然后与用户输入的信息比较,如果相同就向客户返回成功消息并将其Status字段设为1表示上线了,否则返回错误,如果客户收到成功信息就打开主窗口,否则提示出错。如果成功,便打开好友列表窗口,并同时打开在线用户并进行聊天。登录代码如下:

public QqClientLogin()    {    

        jbl1=new JLabel(new ImageIcon());

        jp2=new JPanel(new GridLayout(3,3));        

        jp2_jbl1=new JLabel("QQ号码",JLabel.CENTER);

        jp2_jbl2=new JLabel("QQ密码",JLabel.CENTER);

        jp2_jbl3=new JLabel("忘记密码",JLabel.CENTER);

        jp2_jbl3.setForeground(Color.blue);

        jp2_jbl4=new JLabel("申请密码保护",JLabel.CENTER);

        jp2_jb1=new JButton(new ImageIcon());

        jp2_jtf=new JTextField();

        jp2_jpf=new JPasswordField();

        jp2_jcb1=new JCheckBox("隐身登录");

        jp2_jcb2=new JCheckBox("记住密码");        

        jp2.add(jp2_jbl1);

        jp2.add(jp2_jtf);

        jp2.add(jp2_jb1);

        jp2.add(jp2_jbl2);

        jp2.add(jp2_jpf);

        jp2.add(jp2_jbl3);

        jp2.add(jp2_jcb1);

        jp2.add(jp2_jcb2);

        jp2.add(jp2_jbl4);

        jtp=new JTabbedPane();

        jtp.add("QQ号码",jp2);

        jp1=new JPanel();

        jp1_jb1=new JButton(new ImageIcon());        

        jp1_jb1.addActionListener(this);

        jp1_jb2=new JButton(new ImageIcon());        

        jp1_jb3=new JButton(new ImageIcon());

        jp1.add(jp1_jb1);

        jp1.add(jp1_jb2);

        jp1.add(jp1_jb3);        

        this.add(jbl1,"North");

        this.add(jtp,"Center");

        this.add(jp1,"South");

        this.setSize(350, 240);

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        this.setVisible(true);

    }

    public void actionPerformed(ActionEvent arg0) {

        if(arg0.getSource()==jp1_jb1)        {

            QqClientUser qqClientUser=new QqClientUser();

            User u=new User();

            u.setUserId(jp2_jtf.getText().trim());

            u.setPasswd(new String(jp2_jpf.getPassword()));

            if(qqClientUser.checkUser(u))

            {

                try {

                    QqFriendList qqList=new QqFriendList(u.getUserId());

                    ManageQqFriendList.addQqFriendList(u.getUserId(), qqList);                        ObjectOutputStream oos=new ObjectOutputStream                    (ManageClientConServerThread.getClientConServerThread(u.getUserId()).getS().getOutputStream());

                    Message m=new Message();

                    m.setMesType(MessageType.message_get_onLineFriend);

                    m.setSender(u.getUserId());

                    oos.writeObject(m);

                } catch (Exception e) {

                    e.printStackTrace();                    

                }                

                this.dispose();

            }else{

                JOptionPane.showMessageDialog(this,"用户名密码错误");

            }

        }

3.2.2 好友管理功能

用户登录后,就可以显示好友列表,客户收到其他好友的在线显示,如果用户选择了一个好友,就向服务器发送添加好友聊天,服务器直接转发好友之间的对话。

好友列表由三个模块组成,我的好友、陌生人、和黑名单组成,当当好友在线时头像成亮色显示,如果点击则他的网名成红色显示。代码如下:

更新在线好友方法:

public void UpdateFriend(Message m)

{

        String onLineFriend[]=m.getCon().split(" ");

        for(int i=0;i        {            

            jb1s[Integer.parseInt(onLineFriend[i])-1].setEnabled(true);

        }

    }

    显示好友列表模块的界面就不贴具体代码,但Button事件监听,主要是当点击好友是出现好友的具体在线人,和点击陌生人,黑名单同样会出现在在线与否。

     public void actionPerformed(ActionEvent arg0) {        

        if (arg0.getSource()==jphy_jb2){

            cl.show(this.getContentPane(),"2");

        }else if (arg0.getSource()==jphmd_jb3){

            cl.show(this.getContentPane(),"1");

        }else if (arg0.getSource()==jpmsr_jb1){            

            cl.show(this.getContentPane(),"3");

        }

    }

    public void mouseClicked(MouseEvent arg0) {        

        if(arg0.getClickCount()==2)

        {

            String friendNo=((JLabel)arg0.getSource()).getText();

                    QqChat qqChat=new QqChat(this.owner,friendNo);            

            ManageQqChat.addQqChat(this.owner+" "+friendNo, qqChat);        

        }

    }

    public void mouseEntered(MouseEvent arg0) {

        JLabel jl=(JLabel)arg0.getSource();

        jl.setForeground(Color.red);

    }

    public void mouseExited(MouseEvent arg0) {

        JLabel jl=(JLabel)arg0.getSource();

        jl.setForeground(Color.black);

    }

3.2.3 收发信息功能

收发信息是本聊天系统的核心部分,也是本系统网络传输的体现所在。两个客户端可以通过UDP协议直接通信,但你的好友要在线都可以通过UDP协议给他(她)发送消息,同时也可以接受好友发给你的消息。点击按钮和按Enter发送信息,代码如下:

public void actionPerformed(ActionEvent arg0) {

        if(arg0.getSource()==jb)

        {

            Message m=new Message();

            m.setMesType(MessageType.message_comm_mes);

            m.setSender(this.ownerId);

            m.setGetter(this.friendId);

            m.setCon(jtf.getText());

            m.setSendTime(new java.util.Date().toString());

            jtf.setText(""); 

            try {

                ObjectOutputStream oos=new ObjectOutputStream                (ManageClientConServerThread.getClientConServerThread(ownerId).getS().getOutputStream());

                oos.writeObject(m);

            } catch (Exception e) {

                e.printStackTrace();

            }

        }else

        {

            Message m=new Message();

            m.setMesType(MessageType.message_comm_mes);

            m.setSender(this.ownerId);

            m.setGetter(this.friendId);

            m.setCon(jtf.getText().trim());

            m.setSendTime(new java.util.Date().toString());            

            jtf.setText("");

            try {                

                ObjectOutputStream oos=new ObjectOutputStream                (ManageClientConServerThread.getClientConServerThread(ownerId).getS().getOutputStream());

                oos.writeObject(m);

            } catch (IOException e) {

            e.printStackTrace();

            }

        }

3.3 系统的实现原理

由于本系统最主要的部分在网络传输上,所以网络传输就成了本设计的重中之重,设计好网络传输也就显的很重要,一定要弄清楚网络在此程序中原理。

本系统模式采用的是C/S模式,客户与服务器之间用TCP协议连接,客户与客户之间用UDP协议连接。在服务器端程序中,Socket首先通过socket函数建立服务期端的socket,并通过bind设置socket所使用的服务器IP地址和通信端接口。待服务器端socket建立之后,则通过侦听表示服务器应用程序开始侦听客户端的连接。当收到来自客户端的连接请求时,便通过accept建立与客户端的连接。

客户端的应用程序与服务器段Socket应用程序的流程很相似,最大的区别在于:

1)服务器端Socket应用程序主要用于侦听及接收客户端的连接,而客户端Socket应用程序则用于尝试与服务器建立连接。

2)客户端Socket应用程序发送信息指令至服务器端,并接收服务器端返回的结果;而服务器端Socket应用程序则处理指令逻辑,并将结果或错误信息发送至客户端。

第四章  设计结果及分析

4.1 服务器设计和实现

如图4.1所示服务器已启动,正在进行端口侦听,当有用户登录时,像所有的已登录的客户端发送在线人数。同时像客户端传递信息,服务器起到桥梁的纽带作用,是聊天系统是中枢环节。在局域网内运行服务器端之前,可以通过通过命令窗口下的ipconfig命令获取本机的ip地址,或者直接使用127.0.0.1,然后告诉个客户端,将各客户端的服务器ip地址设为服务器所在的地址。

图 4.1 启动服务器

该模块算法和关键代码分析:服务器模块里创建了3个包,有7个类: ServerFrame,User,Message,MessageType, ManageClientThread, QqServer和QqServerConClientThread。在ServerFrame类里面先创建上面图4.1的窗口,然后给“启动服务”和“停止服务”添加事件。如果是点击了“启动服务”就会调用类QqServert的构造方法,为ServerSocket(int port)建立一个ServerSocket对象,其中port在设计中已经规定为8080,并启动一个线程;如果是点击了“停止服务”就调用QqServert类里的方法close()关闭。QqServerConClientThread类继承了Thread,在这个类里面重写了run()方法。在run()方法里面调用ServerSocket类里的accept()方法接受客户的套接字连接请求,如果有客户发送了连接请求就会返回一个Socket对象,并将其加到Hash表中,它是在ManageClientThread里面定义,它是用来管理客户端线程。同时在公共包中定义了User类来管理用户名和密码,相当于用对象流来管理用户的信息。Message类管理消息,比如发送者,接受者,发送的内容,MessageType类是一个定义信息类型的接口,便于其它类的调用。

该服务器端后台实现的功能为:

(1)接收客户的登录请求,然后建立与对象流的连接,通过客户端发送过来的号码和密码,核对密码是否正确,如果正确就返回该用户的基本信息。

(2)接收客户的获取好友列表请求,然后建立与对象流的连接。

(3)接收客户的读取聊天记录请求,将从客户端接收到两个号码之间的聊天记录全部返回给客户端。

4.2客户端设计和实现

4.2.1 QQ登录的设计和实现

当服务器已连接上时,就可运行客户端,客户端的界面就是一个登录界面如图4.2所示,当密码与帐号想匹配时,才可以显示好友列表,否则显示密码与帐号不匹配,在重新输入可以点击清除帐号,在一次输入,知道登录到好友列表为止。

图4.2 登录界面

同时给登录按钮和自动登录按钮都添加了事件。如果点击了“登录”按钮或者“自动登录”就会把帐号中的文本域和密码中的文本域获得的号码和密码发送给服务器,如果服务器返回的是“ok”就关闭流连接和套接字连接,进入聊天室的主界面。如果密码错误就会提示出错信息对话框,如图4.3所示:

图4.3 密码错误

4.2.2 好友界面的设计和实现

好友界面是在类QqFriendList里实现的。使用java的图形界面设计的一些类和方法创建,如图4.4所示的界面可以显示在线的好友状态。当点击陌生人按钮时,就会切换到陌生人界面,同样也可以切换到黑名单界面,如图4.5所示。

当鼠标指向界面的图标时,列表中的QQ号码会变成红色,移开鼠标,就会恢复以前的颜色。

      

图4.4 好友列表         图4.5陌生人图        4.6黑名列表

4.2.3聊天界面设计和实现

好友界面是在类QqChat中实现的。使用Java GUI图形界面设计的一些类和方法创建,当用户在第二个文本域中输入信息后,如果点击发送按钮,则把消息发送给对方,也可以用textbook监听发送消息并清空文本里的内容,如图4.7所示,当用户点击取消按钮时,用户在第二个文本框中输入的内容将不会发送出去,并且清空文本框中的内容。

         

4.7 QQ好友聊天界面

总  结

这一个月的学习与实践,让我学到了很多,这个系统是虽然是我自己做的一个简单的一对一与一对多的聊天系统,但还是参考了许多书籍与视频,这个聊天系统的优点是在于界面简单,易懂,系统代码也比较容易修改,缺点是功能不够完善,而且没有连接数据库,这次的实训让我自己明白自己的能力还有很大的欠缺,只做到了表面,实质的内容应该在需要的时候更好的利用面向对象的基本特性,让其功能得到进一步的完善。

计算机是一门非常复杂且庞大的学科,一项课题往往需要多项技术才可以完成的。在设计阶段,通过对课题的深入分析与研究,迫使我对技术有了一定的了解。通过这次课程的设计让我巩固了Java GUI界面设计的知识,网络编程的知识和多线程的知识,也让自己明白了平时的知识应该好好的巩固并加以利用而不是学完就完了,这也让我明白了自己所掌握的基础知识还远远不够,所掌握的一些理论知识应更好的运用到实践中去,让自己好好的把它吃透,让他成为自己的知识,才能让自己在IT上有所前景。

计算机技术的高速发展,让我认识到若自己不让自己在这方面加强,就会被淘汰,所以我会好好利用在学校的时间,加紧学习,让自己的基础功更牢,在社会上才能经的起磨练。

致  谢

首先,我要感谢我的指导老师易国红老师,姚峰老师和胡宏银老师,在整个设计过程中他们给予我悉心的关怀和指导。各位老师严谨的治学态度,诲人不倦的敬业精神深深感染着我。他们对我的指导和严格要求将使我一生受益。

然后感谢学校给予我们这样的学习平台,让我们能很好的学以致用,培养了我们的实践能力,同时也感谢班上同学给我的真挚帮助。我最真挚的感谢,谢谢啦。

参考文献

[1]张一白,崔尚森著.面向对象程序设计--Java.山西:西安电子科技大学出版社,2002

[2]W.Richaard Stevens.TCP/IP详解卷1:范建华等译.北京:机械工业出版社,2000

[3]Andrew Stanenbaum1,计算机网络[M]第3版 熊桂喜, 王小虎译.北京:清华大学出版社,1998 

[4](美)JamesF.Kurose Keith W.Rose.计算机网络.清华大学出版社,2003

[5]张海藩著.软件工程导论.北京:清华大学出版社,2003

[6]Beau Williamson.DevelopinglPMulticastNetworks.vol2ume[M].顾金星等译.北京:电子工业出版社,2000

[7]孙卫琴著.基于MVC的Java Web设计与开发[M].北京:电子工业出版社,2004 

[8]龚正虎著.现代TCP/IP 网络原理与技术.国防工业出版社,2002 

[9]张广彬,张永宝等著.Java课程设计案例精编.北京:清华大学出版社,2006 

[10]任泰明著.TCP/IP协议与网络编程.西安电子科技大学出版社,2004

文档

Ichat 聊天系统文档

目录摘要IIAbstractIII第一章绪论11.1课题背景11.2目的与意义11.3开发工具简介21.4Socket的简介4第二章需求分析62.1系统的总体设计62.2系统需求分析62.3系统实现方案分析7第三章详细设计分析93.1服务器端详细说明93.2客户端详细说明103.3系统的实现原理15第四章设计结果及分析1.1服务器设计和实现164.2客户端设计和实现17总结19致谢20参考文献21摘要随着计算机网络技术的快速发展,人们的交流方式越来越多,网络聊天工具已经作为一种重要的信息交
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top