网络聊天室系统 1.docx

上传人:b****4 文档编号:27142180 上传时间:2023-06-27 格式:DOCX 页数:19 大小:137.05KB
下载 相关 举报
网络聊天室系统 1.docx_第1页
第1页 / 共19页
网络聊天室系统 1.docx_第2页
第2页 / 共19页
网络聊天室系统 1.docx_第3页
第3页 / 共19页
网络聊天室系统 1.docx_第4页
第4页 / 共19页
网络聊天室系统 1.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

网络聊天室系统 1.docx

《网络聊天室系统 1.docx》由会员分享,可在线阅读,更多相关《网络聊天室系统 1.docx(19页珍藏版)》请在冰豆网上搜索。

网络聊天室系统 1.docx

网络聊天室系统1

网络聊天室系统

摘要:

该C/S模式的聊天系统,就是服务器来提供服务端连接响应,客户端主动的发起连接请求。

当多个用户同时连接到服务器时,经由服务器的接收与转发便可以实现客户之间的通信。

对于整体系统的流程,也是分为两部分,即客户端的发起请求,服务器响应请求。

首先是客户端设置所想要连接的服务器,然后客户端就会根据设置的服务器IP地址,向服务器发起建立连接请求。

而服务器端是始终在监听网络状态的,主要检测到有一个连接请求,那么服务器就会给当前的发起端分配一个服务线程,用于处理它的各种请求。

关键词:

聊天系统;C/S网络结构;客户端;服务端

 

1绪论

在网络越来越发达的今天,人们对网络的依赖越来越多,越来越离不开网络,由此而产生的聊天工具越来越多,类似QQ,网络聊天时一类的聊天系统的发展日新月异,因此产生了制作一个类似QQ的网络聊天工具的;而且通过制作该程序还能更好的学习网络软件编程知识。

网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。

编程中有两个主要的问题,一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。

在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地址可以唯一地确定Internet上的一台主机。

而TCP层则提供面向应用的可靠的或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层是如何处理数据的。

目前较为流行的网络编程模型是客户机/服务器(C/S)结构。

即通信双方一方作为服务器等待客户提出请求并予以响应。

客户则在需要服务时向服务器提出申请。

服务器一般作为守护进程始终运行,监听网络端口,一旦有客户请求,就会启动一个服务进程来响应该客户,同时自己继续监听服务端口,使后来的客户也能及时得到服务。

2设计功能需求分析

2.1设计概述

本课程设计的目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,客户机器向服务器发聊天请求,服务器应答并能显示客户机发过来的信息。

设计一个网络聊天程序程序,并根据这个程序,说明TCP连接的建立、套接字socket的使用以及端口等问题,从而对TCP层的工作原理有更好的理解和认识。

项目功能特点如下:

1、基本功能:

实现服务器监听,客户端连接,可进行多人会话的C/S聊天室。

2、服务器特点

1)实现GUI界面,可选择端口运行或关闭服务器,可设置最大连接数。

2)在GUI记录运行日志,同时日志被保存在log文件中。

3)显示在线用户,可以强制任意用户下线。

4)可发送系统消息给所有在线用户。

3、客户端特点

1)可使用一个用户名登录服务器,登录之后进入聊天室界面。

2)显示在线用户列表,接收其他用户及系统发送的消息。

3)可选择某个在线用户单独聊天。

具体实现的功能包括:

1.登录验证功能.

2.客户通过服务器转发,实现聊天功能.

3.实时显示目前其它用户的状态.

4.保存并能察看聊天纪录.

5.申请新的用户号码.

6.易用,美观的图形界面,实现系统托盘.

7.实现私聊和公聊功能。

实现网络聊天的功能,采用WindowsSocket(或JavaSocket)编程,服务器与客户端采用了TCP/IP连接方式,在设计聊天方案时,可将所有信息发往服务器端,再由服务器进行处理,服务器端是所有信息的中心。

聊天系统不外乎两个方面,服务器端和客户端。

简单分析一下两个方面所要完成的任务。

服务器端的任务包括:

1、服务器端应当建立一个ServerSocket,并且不断进行侦听是否有客户端连接或者断开连接。

2、服务器端应当是一个信息发送中心,所有客户端的信息都传到服务器端,由服务器端根据要求分发信息。

以上就是服务器端最主要的两个任务。

不难看出,服务器端的任务并不复杂。

客户端应该完成的任务包括:

1、与服务器端建立通信通道,向服务器端发送信息。

2、接收来自服务器的信息。

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

2.2相关技术介绍

1、Winsock控件的用途

创建收集用户信息的客户端应用程序,并将收集的信息发送到某中央服务器。

创建一个服务器应用程序,作为多个用户的数据的汇入点。

创建“聊天”应用程序。

2、选择通讯协议的标准

两类传输协议:

TCP;UDP

TCP是TranferControlProtocol的简称,是一种面向连接的保证可靠传输的协议。

通过TCP协议传输,得到的是一个顺序的无差错的数据流。

发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是serversocket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。

UDP是UserDatagramProtocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。

这两种协议做简单比较:

使用UDP时,每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。

对于TCP协议,由于它是一个面向连接的协议,在socket之间进行数据传输之前必然要建立连接,所以在TCP中多了一个连接建立的时间。

使用UDP传输数据时是有大小限制的,每个被传输的数据报必须限定在64KB之内。

而TCP没有这方面的限制,一旦连接建立起来,双方的socket就可以按统一的格式传输大量的数据。

UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。

而TCP是一个可靠的协议,它确保接收方完全正确地获取发送方所发送的全部数据。

2.3具体方案介绍

本系统所用的工具:

服务器端:

(Windows平台)首先应有java环境jdk,建议采用jdk1.4.2;Eclipse。

客户端:

java环境jdk,建议jdk1.4.2;Eclipse。

本系统运行所需用到的环境为:

硬件配置:

中央处理器(CPU):

P42.0G以上的处理器;

硬盘:

40GB以上硬盘;

内存:

256以上的DDR内存;

显卡:

128M以上显存显卡

软件配置:

WINDOWS7版本、All-In-One-Eclipse-311、j2sdk-1.42等。

具体流程说明如下:

(1)启动服务器程序,服务器端创建一个ServerSocket对象,指定端口号。

(2)ServerSocket对象等候客户端的连接请求。

(3)启动客户端程序。

(4)客户端创建一个Socket对象,指定主机地址和端口号,向服务器发送连接请求。

(5)服务器端收到客户端请求,建立一条TCP连接,再创建一个Socket对象与客户端的Socket对象进行通信。

(6)服务器端和客户端分别建立字节输入/输出流,进行数据传输准备。

(7)服务器端和客户端通过各自的字节输入流获得对方发送过来的数据,通过字节输出向对方发送数据。

(8)一方决定结束通信,向对方发送结束信息,另一方收到结束信息后,双方分别关闭各自的TCP连接。

(9)对象停止等候客户端连接请求。

注:

服务器的run()方法中采用了while(true)结构,不断监听客户端的请求,如收到请求,建立与当前请求的客户端连接的套接字,从而与客户端建立联系。

3网络聊天室系统的开发与实现

3.1开发工具介绍

以目前常用的开发语言来讲有C/C++、.NET技术,JAVA、VisualBasic几种。

还有Eclipse,、BorlandJBuilder等,这些并不是程序语言,而是程序语言在建构程序时的“集成开发工具”,不过它们在开发设计的过程中也占有相当重要的角色,因为选用正确的集成开发工具,可以加速程序设计的进行、测试与排错,因而对整体进度具有决定性的影响。

基于以下几点,选择JAVA语言开发技术。

1、就执行平台而言,必须考虑的问题之一是用户可能使用的操作系统。

用户可能使用的是WindowsLinux。

JAVA语言具有平台无关性,可以不需要任何修改就可以运行在支持JAVA的任何计算机上。

这种跨平台性决定了使用该工具创建的软件能大范围应用在各处。

无论是何种终端与载体,都能实现同样的功效。

2、JAVA的Swing组件开发技术可以开发丰富的图形界面,并且SwingAPI类提供了丰富的外部接口和方法,可以方便实现系统功能。

3、就项目开发而言,纯粹的面向对象,加上数量巨大的类所提供的方法(函数)库的支持,使得利用Java开发各种应用程序,可以说是易如反掌。

此外,在程序除错、修改、升级和增加新功能等方面,因其面向对象的特性,使得这些维护也变得非常容易。

4、Java支持内在的多线程运行,提供分布式的并发机制,运行效率高。

5、异常处理,为了使Java程式更稳定、更安全,Java引入了异常处理机制。

能够在程序中产生异常情况的地方,执行相对应的处理,不至于因突发或意外的错误造成执行中断或是死机。

通过这种异常处理,不仅能够清晰地掌握整个程序执行的流程,也使得程序的设计更为严谨。

6、高性能,Java可以在运行时直接将目标代码翻译成机器指令。

Sun用直接解释器一秒钟内可调用300,000个过程。

翻译目标代码的速度与C/C++的性能没什么区别。

高性能的聊天系统能够带来较好的交互体验,对于使用软件的客户与整体操控服务器情况的管理员里说都大有裨益。

7、网络功能,Java可以说是借助因特网而重获新生的,自然具备编写网络功能的程序。

不论是一般因特网/局域网的程序,如Socket、Email、基于Web服务器的Servlet、JSP程序,甚至连分布式网络程序,如CORBA、RMI等的支持也是非常丰富的,使用起来也很方便。

3.2功能技术介绍

1、Socketsocket=newSocket(Stringhost,intport);客户端创建Socket对象,host是服务器端的IP地址,port是一个端口号,该对象用于连接服务器。

2、BufferedReaderbr=newBufferedReader

(newInputStreamReader(socket.getInputStream()));创建一个使用默认大小输入缓冲区的缓冲字符输入流。

该输入流的指向是一个Reader流,Reader流将数据读入缓冲区,BufferedReader再从缓冲区中读取数据。

InputStreamReader是字节流通向字符流的桥梁:

它使用指定的charset读取字节并将其解码为字符。

getInputStream()获取字节输入流。

3、PrintStreamps=newPrintStream(socket.getOutputStream());创建新的打印流,PrintStream为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。

它还提供其他两项功能。

与其他输出流不同,PrintStream永远不会抛出IOException;而是,异常情况仅设置可通过checkError方法测试的内部标志。

4、Filefile=getFile();调用getFile()函数返回一个file的的路径,提示用户输入一个路径,判断是否存在该文件,如果输入非法给予提示,重新输入。

5、ps.println(file.getName());ps.println(file.length());将文件名和大小发送到服务端。

6、Stringmsg=br.readLine();if("已存在".equals(msg)){}接收服务器发送回来的是否存在的结果.如果文件已存在,打印提示,客户端退出.如果不存在,准备开始上传。

7、longfinishLen=Long.parseLong(msg);服务器端文件的长度。

8、FileInputStreamfis=newFileInputStream(file);创建FileInputStream从文件中读取数据,OutputStreamout=socket.getOutputStream();输出字节流,输出流接收输出字节并将这些字节写出到Socket的输出流。

3.3实现界面如下

系统用户登陆时,显示如下情形:

图3-1系统登陆界面

启动服务器时,可以看到如下启动界面:

图3-2服务器启动界面

用户选择相应的主机,进入对应的聊天界面后,会变更如下:

图3-3用户登陆后界面

用户输入一定的聊天信息,就会在各个界面显示,效果如下:

图3-4聊天情形

在服务器的角度,能看到所有聊天的连接与变动,显示如下:

图3-5服务器显示信息

重要的实现代码选摘如下:

客户端启动关键代码:

publicStart(){

LoginJFrameframe=newLoginJFrame();//启动登录窗口

//Validateframesthathavepresetsizes

//Packframesthathaveusefulpreferredsizeinfo,e.g.fromtheirlayout

if(packFrame){

frame.pack();

}else{

frame.validate();

}

//居中

DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();

DimensionframeSize=frame.getSize();

if(frameSize.height>screenSize.height){

frameSize.height=screenSize.height;

}

if(frameSize.width>screenSize.width){

frameSize.width=screenSize.width;

}

frame.setLocation((screenSize.width-frameSize.width)/2,

(screenSize.height-frameSize.height)/2);

frame.setVisible(true);

frame.txtNick.requestFocus(true);

}

用户登陆的关键代码:

publicvoidbtnLogin_actionPerformed(ActionEvente){

StringhostName=txtName.getText().trim();//获得用户输入的主机名

StringnickName=txtNick.getText().trim();//获得用户输入的昵称

if(hostName.equals("")||nickName.equals(""))//判断用户是否有一项没有输入

{

JOptionPane.showMessageDialog(null,"主机名和昵称必须输入!

","错误",JOptionPane.ERROR_MESSAGE);

}else

{

try{

InetAddressaddr=InetAddress.getByName(hostName);//获得主机ip地址

Sockets=newSocket(addr,9001);//连接服务器

ChatFramecf=newChatFrame(s,nickName);//打开聊天界面

cf.setSize(490,450);//设置聊天界面大小

cf.setResizable(false);//设置聊天窗体固定大小

cf.setLocationRelativeTo(cf);//聊天窗体居中

cf.setVisible(true);//使聊天窗体可见

this.dispose();//关闭登录窗体

}catch(Exceptionex)

{

JOptionPane.showMessageDialog(null,"主机不存在!

请检查您的输入!

");//当服务器未开启时

}

}

用户的聊天信息实现关键代码如下:

publicvoidbtnSend_actionPerformed(ActionEvente){

Stringtext=txtMessage.getText().trim();//获得用户输入的信息

txtMessage.setText("");//清空文本框

if(text.equals("")){

JOptionPane.showMessageDialog(null,"信息不能为空!

");

}else{

//获得发送消息的类型

intindex=cmbType.getSelectedIndex();//获得用户选择的是私聊还是群聊

if(index==0){

out.println(clientName+":

all:

"+text);

}else{

intitem=lstUsers.getSelectedIndex();//获得用户选择的私聊成员

if(item==-1){

JOptionPane.showMessageDialog(null,"私聊必须选择一个用户");//如果用户没有选择用户

}else{

Stringname=lstUsers.getSelectedValue().toString();//获得用户选择的私聊成员的昵称

if(name.equals(clientName))

{

JOptionPane.showMessageDialog(null,"您不能和您自己私聊");//如果用户选择的是自己

}else

{

((DefaultListModel)lstChat.getModel()).addElement(clientName+"对"+name+"说:

"+text);

out.println(clientName+":

"+item+":

"+text);//发送信息

}

}

}

}

}

服务器端的关键代码如下:

classListenerThreadextendsThread{

publicvoidrun(){

while(flag){

try{

Sockets=ss.accept();

//启动与客户端会话线程

newChatThread(s).start();

}catch(IOExceptionex){

flag=false;

}

}

}

}

//发送客户列表信息

publicvoidsendList()

{

DefaultListModeldlm=(DefaultListModel)lstUsers.getModel();

Enumerationem=dlm.elements();

while(em.hasMoreElements()){

ClientBeancb=(ClientBean)em.nextElement();

cb.getOut().println("list:

"+dlm.toString());

}

}

//发送群聊信息

publicvoidsendAll(Stringmsg){

((DefaultListModel)lstChat.getModel()).addElement(msg);

Enumerationem=((DefaultListModel)lstUsers.getModel()).elements();

while(em.hasMoreElements()){

ClientBeancb=(ClientBean)em.nextElement();

cb.getOut().println(msg);

}

}

//发送消息

publicvoidbtnSend_actionPerformed(ActionEvente){

//获得输入的信息内容

Stringtext=txtMsg.getText().trim();

txtMsg.setText("");

if(text.equals("")){

JOptionPane.showMessageDialog(null,"消息不能为空!

");

}else{

//获得发送的类型

intindex=cmbType.getSelectedIndex();

//索引为0代表是群聊

if(index==0){

Stringmsg="管理员对所有人说:

"+text;

sendAll(msg);

}

//否则是私聊

else{

Objectobj=lstUsers.getSelectedValue();

if(obj==null){

JOptionPane.showMessageDialog(null,"私聊必须要选择一个客户");

}else{

ClientBeancb=(ClientBean)obj;

Stringmsg="管理员对"+cb.getClientName()+"说:

"+text;

sendPrivate(msg,cb);

}

}

}

}

4结语

通过本次设计,加深了对TCP/UDP协议具体连接过程的理解,并通过Socket接口的编程熟悉了具体实现,对软件工程的实际运用有了初步的认识,为以后更深层次的编程奠定了基础;同时通过设计温习了java的相关编程知识。

在做这次软件工程设计之前基本上还没接触过网络编程,这次实验是在边学习边实践的基础上完成的.本学期的和其他实验也很多,因此做的时间不多,做的结果也不太好,与自己原来的设想有些差距.通过本次设计我们对网络的基础知识也打下了很好的基础.通过这次网络设计,可以说是在理解网络的基础上,加深了对UDP协议具体连接过程的理解,并通过Socket接口的编程熟悉了具体实现,对网络编程有了初步的认识,为以后更深层次的编程奠定了基础;同时通过本次设计温习了java的相关编程知识。

在做本次设计时,我们将上学期学的软件工程思想充分运用到这次设计之中.在进行设计之前,先进行需求功能分析,在功能分析的基础上,划分程序的框架,创建类来分担不同的功能,并根据类的功能加入函数和变量,这对详细设计有一个总纲的作用,收到了很好的效果.

在本次设计中,我们进行了详细的分工。

加强了大家的团队精神,分工合作的能力。

各自也从分工中学习到了新的知识,理解到了,分工的重要性。

检验了软件工程课堂上学习的软件工程各个步骤的重要性。

希望在以后的学习生涯中有更多的锻炼机会。

不断加强我们的编程技术和软件工程运用的能力。

参考文献

[1]任飞.基于JSP的网上聊天室系统的设计与实现[D].电子

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

当前位置:首页 > 高中教育 > 高中教育

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

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