基于Socket的网络聊天系统的开发与设计.docx

上传人:b****6 文档编号:7011771 上传时间:2023-01-16 格式:DOCX 页数:33 大小:276.57KB
下载 相关 举报
基于Socket的网络聊天系统的开发与设计.docx_第1页
第1页 / 共33页
基于Socket的网络聊天系统的开发与设计.docx_第2页
第2页 / 共33页
基于Socket的网络聊天系统的开发与设计.docx_第3页
第3页 / 共33页
基于Socket的网络聊天系统的开发与设计.docx_第4页
第4页 / 共33页
基于Socket的网络聊天系统的开发与设计.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

基于Socket的网络聊天系统的开发与设计.docx

《基于Socket的网络聊天系统的开发与设计.docx》由会员分享,可在线阅读,更多相关《基于Socket的网络聊天系统的开发与设计.docx(33页珍藏版)》请在冰豆网上搜索。

基于Socket的网络聊天系统的开发与设计.docx

基于Socket的网络聊天系统的开发与设计

编号

 

本本科生毕业设计

基于Socket的网络聊天系统开发与设计

DevelopmentandDesignofNetworkchatSystemBasedontheSocket

学生姓名

张小好

专业

计算机科学与技术

学号

1141229

指导教师

陈晨

分院

信息工程分院

2015年6月

摘要

在信息技术高速发展的今天,Internet技术的发展已经深刻的改变了人们的生活。

摒弃了原始的通信方式,开发新的通信方式是必不可少的,人们希望用更方便、更廉价、更快捷的通信方式。

这时就需要开发一套网络聊天系统,本课题研究的是基于SOCKET通讯协议的网络聊天系统的开发与设计。

本次开发使用的是JAVA语言,文中介绍了本系统的结构和功能,最终实现可以私聊、群聊、文件传送的网络聊天系统。

本次设计主要以Socket网络通讯作为基础,采用Swing来实现的图形界面。

关键词:

JavaSocket通讯协议Swing

 

Abstract

Intheinformationtechnologyrapiddevelopmenttoday,thedevelopmentofInternettechnologyhasprofoundlychangedpeople'slife.Abandonedtheoriginalwayofcommunication,thedevelopmentofnewcommunicationmodeisindispensable,peoplewanttousemoreconvenient,cheaperandfasterwayofcommunication.Thenyouneedtodevelopasetofnetworkchatsystem,thisresearchisbasedontheSOCKETofnetworkchatsystemdevelopmentanddesign.

ThedevelopmentusingtheJAVAlanguage,thispaperintroducesthestructureandfunctionofthissystem,finallycanprivatechat,groupchat,filetransfernetworkchatsystem.ThisdesignmainlySocketnetworkcommunicationasthefoundation,theSwingtechniquewasusedtorealizethegraphicalinterface.

Keywords:

JavaSocketCommunicationprotocolSwing

绪论

选题的背景和意义

在Internet的计算机网络大潮中,人们已渐渐习惯于在网络上购物、聊天、看电影、交朋友等,人们的生活也是离不开网络。

我们每天都在各种各样的网络应用中满足自己的需求。

慢慢的,网络也无时无刻的改变人们的生活。

当前人们进行信息交流的方式非常多,例如电报、电话、电子邮件等通讯手段。

但是这些都存在不便利或者费用方面的问题,例如电子邮件,虽然费用不高,甚至可以免费使用,但是无法实现即时通讯,只能作为一种辅助交流的通讯手段。

这时开发一套网络聊天系统变得尤为重要,通过该系统不但能够实现点对点的交流,还能够实现多人同时聊天,并且可以相互传递文件资料。

最主要的是,它的费用非常低廉,信息处理速度快,这样人们才能在这个活动的社会中加强联系,从而创建出更多的财富和价值。

现如今已有很多的网络聊天系统,例如腾讯的QQ、微信、阿里旺旺等等。

这些网络聊天系统已经非常成熟了,不过它们都要求用户必须连接互联网才能够进行通信。

所以根据用途的不同,我想开发的这一套网络聊天系统是在一个局域网中实现通信的,这样可以防止网络中的一些窥听,对信息安全性要求高的企业或是私人工作环境是一个很好的解决方案。

该系统分为server端和客户端两部分组成,server端需要运行在服务器上,而客户端需要安装在用于通信的PC上,用户只需通过客户端连接至服务器上,就可以实现在局域网内的即时通信了。

本课题主要研究的是基于Socket的聊天软件,对于这个聊天软件的设计是分为服务器程序和客户端程序,本课题的目标是能实现用户在客户端与服务器端传递信息。

主要研究开发内容是:

熟悉系统开发平台,探索在此开发平台下,利用Socket编程技术、多线程开发技术、TCP/IP协议等进行聊天软件的实际开发。

具体要实现的目标如下:

(1)实现用户的注册、登陆、修改信息等功能

(2)实现点对点的通信,即私聊(3)实现一对多的通信,即群聊(4)实现点对点的文件传输。

 

第一章系统所涉及到的技术

1.1Java语言概述

JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,由升阳(SunMicrosystems)公司的詹姆斯·高斯林(JamesGosling)等人于1990年代初开发。

它最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。

由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。

就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,在1995年5月23日以“Java”的名称正式发布了。

Java伴随着互联网的迅猛发展而发展,成为当今计算机业界不可忽视的力量和重要的发展潮流与方向。

1.1.1Java语言的起源

最早Java语言的出现是源于独立开发平台语言的需要,当时人们希望能编写出嵌入到各种家用电器等设备的芯片上、且易于维护的程序。

它的出现是为了弥补当时的编程语言,例如C、C++等只能对特定的CPU芯片进行编译的缺陷。

Java的设计者们就大胆设想让更换芯片的电器还是能够正确运行,无需重新编译芯片,因此Sun公司于1990年成立了由JamesGosling领导的开发小组,开始致力于开发一种可移植的、跨平台的语言,该语言能生成正确运行于各种操作系统、各种CPU芯片上的代码。

经过他们的精心钻研和努力,便促成了Java语言的诞生。

1.1.2Java语言的发展前景

在2005年的JavaOne开发者大会上,JamesGosling做了题为“Java技术下一个10年贡献”的演讲,JamesGosling认为,Java技术提高了计算的“流动性”,就如同货币的发明提高了商品的流动性一样。

无所不在的网络丰富了每个人的信息量,就如同可以兑换的货币产生了财富一样。

由于从前的网络速度是很慢的,所以计算被束缚在特定的计算机上,而这种情况将一去不复返了。

目前,全球Java开发人员已经超过450万,因此Java社区是一个充满活力和创新精神的团队,这正是Java更加繁荣的保障。

为了保持Java的增长和推进Java社区的参与,Sun在JavaOne开发者大会上宣布开放Java核心源代码,以鼓励更多的人参与到社团活动中来,这是Sun为推进社团发展和维护Java技术兼容性而迈出的重要一步,同时也是Java技术在创新和社会进步上继续发挥重要作用的标志。

随着Java的开源,在未来的十年里,Java的应用范围将变得更广。

数字媒体将是Java的下一个目标,同时,Java将教育和健康作为未来Java发展过程中的两大重点应用领域。

1.1.3Java的语法

Java是面向对象的程序设计语言,其基本语法和C语言大致相同。

从一定角度上讲,C语言加上面向对象功能就是C++。

那么Java与C++有什么区别呢?

简要地说,Java改进了C++的一些缺点,并增加了一些新的功能,从而变得比C++更加简单、易学,编写出来的程序也更具健壮性。

下面就对它们进行一个简单的比较。

îJava去掉了C语言的指针。

如指针使用得当,对增强程序的功能有很大帮助,一旦使用不当,经常会导致死机。

îJava没有了C语言中的预处理器。

如#ifdef、#define、常量声明等都不使用了,当然也少了#include命令,从而也没有头文件(.h文件)。

和C++相比,Java不支持多继承的概念,目的是为了避免对象和对象之间的关系复杂化。

îJava增加了垃圾回收机制、异常处理和新的限定词等功能。

这些几乎全部都是基于整个系统和程序本身安全性的考虑。

î不论在何种平台上,Java基本数据类型的大小是不变的。

1.2Socket编程

Socket接口是访问Internet使用得最广泛的方法。

如果你有一台刚配好TCP/IP协议的主机,其IP地址是192.168.0.1,此时在另一台主机或同一台主机上执行ftp192.168.0.1,显然无法建立连接。

因"192.168.0.1"这台主机没有运行FTP服务软件。

同样,在另一台或同一台主机上运行浏览软件如Netscape,输入"http:

//192.168.0.1",也无法建立连接。

现在,如果在这台主机上运行一个FTP服务软件(该软件将打开一个Socket,并将其绑定到21端口),再在这台主机上运行一个Web服务软件(该软件将打开另一个Socket,并将其绑定到80端口)。

这样,在另一台主机或同一台主机上执行ftp192.168.0.1,FTP客户软件将通过21端口来呼叫主机上由FTP服务软件提供的Socket,与其建立连接并对话。

而在netscape中输入"http:

//192.168.0.1"时,将通过80端口来呼叫主机上由Web服务软件提供的Socket,与其建立连接并对话。

在Internet上有很多这样的主机,这些主机一般运行了多个服务软件,同时提供几种服务。

每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

Socket正如其英文原意那样,象一个多孔插座。

一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。

客户软件将插头插到不同编号的插座,就可以得到不同的服务。

在Java中所谓Socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。

应用程序通常通过"套接字"向网络发出请求或者应答网络请求。

,Socket和ServerSocket类库位于包中。

ServerSocket用于服务器端,Socket是建立网络连接时使用的。

在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。

对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。

不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

重要的SocketAPI:

.Socket继承于java.lang.Object,有八个构造器,其方法并不多,下面介绍使用最频繁的三个方法。

Accept方法用于产生"阻塞",直到接受到一个连接,并且返回一个客户端的Socket对象实例。

"阻塞"是一个术语,它使程序运行暂时"停留"在这个地方,直到一个会话产生,然后程序继续;通常"阻塞"是由循环产生的。

getInputStream方法获得网络连接输入,同时返回一个InputStream对象实例。

getOutputStream方法连接的另一端将得到输入,同时返回一个OutputStream对象实例。

注意:

其中getInputStream和getOutputStream方法均可能会产生一个IOException,它必须被捕获,因为它们返回的流对象,通常都会被另一个流对象使用。

服务器,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。

客户端不需要指定打开的端口,通常临时的、动态的分配一个1024以上的端口。

Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。

要学Internet上的TCP/IP网络编程,必须理解Socket接口。

Socket接口设计者最先是将接口放在Unix操作系统里面的。

如果了解Unix系统的输入和输出的话,就很容易了解Socket了。

网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。

Socket也具有一个类似于打开文件的函数调用Socket(),该函数返回一个整型的Socket描述符,随后的连接建立、数据传输等操作都是通过该Socket实现的。

1.3TCP/IP协议

TCP/IP是TransmissionControlProtocol/InternetProtocol的简写,中文译名为传输控制协议/互联网络协议,该协议是Internet最基本的协议,简单地说,就是由底层的IP协议和TCP协议组成的。

TCP/IP协议的开发工作始于70年代,是用于互联网的第一套协议。

1.3.1TCP/IP参考模型

TCP/IP协议的开发研制人员将Internet分为五个层次,以便于理解,它也称为互联网分层模型或互联网分层参考模型,如下所示:

物理层:

对应于网络的基本硬件,这也是Internet物理构成,即我们可以看得见的硬设备,如PC机、互连网服务器、网络设备等,必须对这些硬设备的电气特性作一个规范,使这些设备都能够互相连接幷兼容使用。

网络接口层:

它定义了将资料组成正确帧的规程和在网络中传输帧的规程,帧是指一串资料,它是资料在网络中传输的单位。

互联网层:

本层定义了互联网中传输的“信息包”格式,以及从一个用户通过一个或多个路由器到最终目标的"信息包"转发机制。

传输层:

为两个用户进程之间建立、管理和拆除可靠而又有效的端到端连接。

应用层:

它定义了应用程序使用互联网的规程。

1.3.2网间协议IP

Internet上使用的一个关键的底层协议是网际协议,通常称IP协议。

我们利用一个共同遵守的通信协议,从而使Internet成为一个允许连接不同类型的计算机和不同操作系统的网络。

要使两台计算机彼此之间进行通信,必须使两台计算机使用同一种"语言"。

通信协议正像两台计算机交换信息所使用的共同语言,它规定了通信双方在通信中所应共同遵守的约定。

计算机的通信协议精确地定义了计算机在彼此通信过程的所有细节。

例如,每台计算机发送的信息格式和含义,在什么情况下应发送规定的特殊信息,以及接收方的计算机应做出哪些应答等等。

网际协议IP协议提供了能适应各种各样网络硬件的灵活性,对底层网络硬件几乎没有任何要求,任何一个网络只要可以从一个地点向另一个地点传送二进制数据,就可以使用IP协议加入Internet了。

如果希望能在Internet上进行交流和通信,则每台连上Internet的计算机都必须遵守IP协议。

为此使用Internet的每台计算机都必须运行IP软件,以便时刻准备发送或接收信息。

IP协议对于网络通信有着重要的意义:

网络中的计算机通过安装IP软件,使许许多多的局域网络构成了一个庞大而又严密的通信系统。

从而使Internet看起来好象是真实存在的,但实际上它是一种幷不存在的虚拟网络,只不过是利用IP协议把全世界上所有愿意接入Internet的计算机局域网络连接起来,使得它们彼此之间都能够通信。

1.3.3传输控制协议TCP

尽管计算机通过安装IP软件,从而保证了计算机之间可以发送和接收资料,但IP协议还不能解决资料分组在传输过程中可能出现的问题。

因此,若要解决可能出现的问题,连上Internet的计算机还需要安装TCP协议来提供可靠的幷且无差错的通信服务。

TCP协议被称作一种端对端协议。

这是因为它为两台计算机之间的连接起了重要作用:

当一台计算机需要与另一台远程计算机连接时,TCP协议会让它们建立一个连接、发送和接收资料以及终止连接。

传输控制协议TCP协议利用重发技术和拥塞控制机制,向应用程序提供可靠的通信连接,使它能够自动适应网上的各种变化。

即使在Internet暂时出现堵塞的情况下,TCP也能够保证通信的可靠。

众所周知,Internet是一个庞大的国际性网络,网络上的拥挤和空闲时间总是交替不定的,加上传送的距离也远近不同,所以传输资料所用时间也会变化不定。

TCP协议具有自动调整"超时值"的功能,能很好地适应Internet上各种各样的变化,确保传输数值的正确。

因此,从上面我们可以了解到:

IP协议只保证计算机能发送和接收分组资料,而TCP协议则可提供一个可靠的、可流控的、全双工的信息流传输服务。

综上所述,虽然IP和TCP这两个协议的功能不尽相同,也可以分开单独使用,但它们是在同一时期作为一个协议来设计的,幷且在功能上也是互补的。

只有两者的结合,才能保证Internet在复杂的环境下正常运行。

凡是要连接到Internet的计算机,都必须同时安装和使用这两个协议,因此在实际中常把这两个协议统称作TCP/IP协议。

1.4Swing简介

Swing是一个用于开发Java应用程序用户界面的开发工具包。

它以抽象窗口工具包(AWT)为基础使跨平台应用程序可以使用任何可插拔的外观风格。

Swing开发人员只用很少的代码就可以利用Swing丰富、灵活的功能和模块化组件来创建优雅的用户界面。

Swing的产生主要原因就是AWT不能满足图形化用户界面发展的需要。

AWT设计的初衷是支持开发小应用程序的简单用户界面。

例如AWT缺少剪贴板、打印支持、键盘导航等特性,而且原来的AWT甚至不包括弹出式菜单或滚动窗格等基本元素。

此外AWT还存在着严重的缺陷,人们使AWT适应基于继承的、具有很大伸缩性的事件模型,基于同位体的体系结构也成为其致命的弱点。

随着发展的需要,Swing出现了,Swing组件几乎都是轻量组件,与重量组件相比,没有本地的对等组件,不像重量组件要在它们自己的本地不透明窗体中绘制,轻量组件在它们的重量组件的窗口中绘制。

这一讲我们讲一下基本的Swing组件使用方法和使用Swing组件创建用户界面的初步方法。

Swing是由100%纯Java实现的,Swing组件是用Java实现的轻量级(light-weight)组件,没有本地代码,不依赖操作系统的支持,这是它与AWT组件的最大区别。

由于AWT组件通过与具体平台相关的对等类(Peer)实现,因此Swing比AWT组件具有更强的实用性。

Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性。

Swing采用了一种MVC的设计范式,即"模型-视图-控制"(Model-View-Controller),其中模型用来保存内容,视图用来显示内容,控制器用来控制用户输入。

Swing外观感觉采用可插入的外观感觉(PluggableLookandFeel,PL&F)

在AWT组件中,由于控制组件外观的对等类与具体平台相关,使得AWT组件总是只有与本机相关的外观。

Swing使得程序在一个平台上运行时能够有不同的外观。

用户可以选择自己习惯的外观。

1.5多线程技术介绍

多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立。

线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单。

多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”。

如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速度非常快,用户感觉不到其中的区别,因此我们也不用关心它,只需要设想各个线程是同时执行即可。

多线程和传统的单线程在程序设计上最大的区别在于,由于各个线程的控制流彼此独立,使得各个线程之间的代码是乱序执行的,由此带来的线程调度,同步等问题。

1.5.1在Java中实现多线程。

我们不妨设想,为了创建一个新的线程,我们需要做些什么?

很显然,我们必须指明这个线程所要执行的代码,而这就是在Java中实现多线程我们所需要做的一切!

真是神奇!

Java是如何做到这一点的?

通过类!

作为一个完全面向对象的语言,Java提供了类java.lang.Thread来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程,我们以后的讨论都将围绕这个类进行。

那么如何提供给Java我们要线程执行的代码呢?

让我们来看一看Thread类。

Thread类最重要的方法是run(),它为Thread类的方法start()所调用,提供我们的线程所要执行的代码。

为了指定我们自己的代码,只需要覆盖它!

方法一:

继承Thread类,覆盖方法run(),我们在创建的Thread类的子类中重写run(),加入线程所要执行的代码即可。

下面是一个例子:

publicclassMyThreadextendsThread{

intcount=1,number;

publicMyThread(intnum){

number=num;

System.out.println("创建线程"+number);

}

publicvoidrun(){

while(true){

System.out.println("线程"+number+":

计数"+count);

if(++count==6)return;

}

}

publicstaticvoidmain(Stringargs[]){

for(inti=0;i〈5;i++)newMyThread(i+1).start();

}

}

这种方法简单明了,符合大家的习惯,但是,它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自Applet类),则无法再继承Thread类,这时如果我们又不想建立一个新的类,应该怎么办呢?

我们不妨来探索一种新的方法:

我们不创建Thread类的子类,而是直接使用它,那么我们只能将我们的方法作为参数传递给Thread类的实例,有点类似回调函数。

但是Java没有指针,我们只能传递一个包含这个方法的类的实例。

那么如何限制这个类必须包含这一方法呢?

当然是使用接口!

(虽然抽象类也可满足,但是需要继承,而我们之所以要采用这种新方法,不就是为了避免继承带来的限制吗?

Java提供了接口java.lang.Runnable来支持这种方法。

方法二:

实现Runnable接口

Runnable接口只有一个方法run(),我们声明自己的类实现Runnable接口并提供这一方法,将我们的线程代码写入其中,就完成了这一部分的任务。

但是Runnable接口并没有任何对线程的支持,我们还必须创建Thread类的实例

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1