java课程设计报告java聊天室Word文件下载.docx

上传人:b****6 文档编号:20396577 上传时间:2023-01-22 格式:DOCX 页数:54 大小:286.86KB
下载 相关 举报
java课程设计报告java聊天室Word文件下载.docx_第1页
第1页 / 共54页
java课程设计报告java聊天室Word文件下载.docx_第2页
第2页 / 共54页
java课程设计报告java聊天室Word文件下载.docx_第3页
第3页 / 共54页
java课程设计报告java聊天室Word文件下载.docx_第4页
第4页 / 共54页
java课程设计报告java聊天室Word文件下载.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

java课程设计报告java聊天室Word文件下载.docx

《java课程设计报告java聊天室Word文件下载.docx》由会员分享,可在线阅读,更多相关《java课程设计报告java聊天室Word文件下载.docx(54页珍藏版)》请在冰豆网上搜索。

java课程设计报告java聊天室Word文件下载.docx

套接字对象在网络编程中扮演者重要的角色,可以用套接字技术编写一个聊天室,服务器为每个客户启动一个线程。

在该线程中通过套接字和客户交流信息,当客户向服务器发送一条聊天信息“大家好”时,服务器要让所有的这些线程中的输入流写入信息大家好,这样所有的客户的套接字的输入流就都读取到了这一条信息。

如果把信息“你好”发送给特定用户,服务器就让特定线程中的输出流写入信息“你好”,那么只有特定客户的套机字的输入流可以读取到这条信息。

在聊天室中需要对用户上线下线的状态进行修改,进而统计在线人数、查找某用户等。

因而需要用到java链表来实现。

由于Java语言不像c或c++一样可以利用线性表的链式存储结构,用节点和指针来表示,在Java中是没有指针的,但是可以通过使用对象的引用来实现链表。

链表的结点个数称为链表的长度。

因此在Java中可以定义两个类来实现链表的操作,分别为节点类和链表类。

在本设计中对用户的存储就是利用链表来实现的。

2.2基本设计概念和处理流程

本系统运行用JAVA开发,采用C\S结构,系统分为客服端和服务端两大模块,使用Socket类建立套接字实现客服端和服务端得通讯。

处理流程

 

服务端客户端

一个ServerSocket对象和一个Socket对象一个Socketd对象

TCPSocket通信流程

2.3总体结构

2.4功能分配

客户端

向所有人或一个人发送消息

服务端

2.5接口设计

2.5.1用户接口

提供一个用户操作界面:

包括用户可以再界面中登录聊天室、输入消息、浏览聊天内容和聊天对象。

同时提供一个服务器操作界面,通过服务器操作界面可以修改服务器的配置,知道用户的当前状态,并可以给用户发送指定系统信息。

2.5.2内部接口

Socket(stringhont,intport);

客户端使用Socket类建立与服务器的套接字连接。

ServerSocket(intport);

建立接收客户的套接字的服务器套接字。

2.6主要模块

2.6.1聊天室服务器端模块

聊天室服务器端模块主要有以下几部分组成

1、主框架类(ChatServer.java)

该文件包含名为ChatServer的public类,其主要功能是定义服务器的界面,添加事件侦听鱼事件处理。

ChatServer类调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端消息的转发。

2、服务器用户上线与下线侦听类。

该类对用户上线与下线的侦听是通过调用用户链表类来实现的,当用户的上线与下线情况发生改变时,该类会对主类的界面进行相应的修改。

3、服务器消息收发类

该类分别定义了向某用户及向所有人发送消息的方法,发送的消息会显示在主界面类的界面上。

4用户修改配置的类。

该类继承自JDialog。

使用户对服务器端口进行修改配置的类。

5节点类

定义了链表中的用户

6链表类

该类通过构造函数构造用户链表,定义了添加用户、删除用户、返回用户数、根据用户名查找用户和各根据索引查找用户等方法。

7服务器帮助类、

2.6.2聊天室服务器端模块算法描述

服务器端的ChatServer类继承自JFrame并实现相应的事件监听接口,因此它定义了服务器的主框架,及各个按钮的事件监听。

它分别调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端消息的转发。

同时服务器可以响应多个客户的请求,当一个客户发送请求时,服务器就为它增加一个线程,同时服务器利用UserLinkList类为客户端设置一个请求队列,如果服务器不能马上响应客户端的请求,就要把这个请求放到请求队列在中,,等服务器将当前的请求处理完,会自动到请求队列中按照先后顺序取出请求进行处理。

2.6.3聊天室客户端模块

客户端主要有以下几个文件,功能如下:

1客户端主框架类

该类主要定义客户端的界面,添加事件侦听与事件处理。

该类定义了与服务器实现连接与断开连接的方法。

当用户登录到指定的服务器上时,该类条用客户端实现消息收发的类实现消息的收发。

同时该类定义了向所有用户发送消息的方法。

2客户端消息收发的类

该类实现了服务器与客户端消息的收发

3用户修改配置的类

该类继承自JDialog,是用户对要连接的服务器IP及侦听端口进行修改配置的类。

4帮助类

客户端用户程序的帮助类

2.6.4聊天室客户端模块主要算法描述

客户端ChatClient类继承了JFrame并实现相应的事件监听接口。

它实现了客户端的主界面及相应按钮的事件侦听。

该类调用ClientReceive类实现消息的收发。

通过相应的输入输出流与服务器进行数据的传递与交流。

三、主要代码实现

3.1服务器主要代码实现

1、Chatserver类:

包含名为ChatServer的public类,其主要功能为定义服务器端的界面,添加事件侦听与事件处理。

调用ServerListen类来实现服务端用户上线与下线的侦听,调用ServerReceive类来实现服务器端的消息的收发。

importjava.awt.*;

importjava.awt.event.*;

importjavax.swing.*;

importjavax.swing.event.*;

import.*;

importjava.io.*;

/*

*聊天服务端的主框架类

*/

publicclassChatServerextendsJFrameimplementsActionListener{

publicstaticintport=8888;

//服务端的侦听端口

ServerSocketserverSocket;

//服务端Socket

Imageicon;

//程序图标

JComboBoxcombobox;

//选择发送消息的接受者

JTextAreamessageShow;

//服务端的信息显示

JScrollPanemessageScrollPane;

//信息显示的滚动条

JTextFieldshowStatus;

//显示用户连接状态

JLabelsendToLabel,messageLabel;

JTextFieldsysMessage;

//服务端消息的发送

JButtonsysMessageButton;

//服务端消息的发送按钮

UserLinkListuserLinkList;

//用户链表

//建立菜单栏

JMenuBarjMenuBar=newJMenuBar();

//建立菜单组

JMenuserviceMenu=newJMenu("

服务(V)"

);

//建立菜单项

JMenuItemportItem=newJMenuItem("

端口设置(P)"

JMenuItemstartItem=newJMenuItem("

启动服务(S)"

JMenuItemstopItem=newJMenuItem("

停止服务(T)"

JMenuItemexitItem=newJMenuItem("

退出(X)"

JMenuhelpMenu=newJMenu("

帮助(H)"

JMenuItemhelpItem=newJMenuItem("

//建立工具栏

JToolBartoolBar=newJToolBar();

//建立工具栏中的按钮组件

JButtonportSet;

//启动服务端侦听

JButtonstartServer;

JButtonstopServer;

//关闭服务端侦听

JButtonexitButton;

//退出按钮

//框架的大小

DimensionfaceSize=newDimension(400,600);

ServerListenlistenThread;

JPaneldownPanel;

GridBagLayoutgirdBag;

GridBagConstraintsgirdBagCon;

/**

*服务端构造函数

publicChatServer(){

init();

//初始化程序

//添加框架的关闭事件处理

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.pack();

//设置框架的大小

this.setSize(faceSize);

//设置运行时窗口的位置

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

this.setLocation((int)(screenSize.width-faceSize.getWidth())/2,

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

this.setResizable(false);

this.setTitle("

聊天室服务端"

//设置标题

//程序图标

icon=getImage("

icon.gif"

this.setIconImage(icon);

//设置程序图标

show();

//为服务菜单栏设置热键'

V'

serviceMenu.setMnemonic('

//为端口设置快捷键为ctrl+p

portItem.setMnemonic('

P'

portItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));

//为启动服务快捷键为ctrl+s

startItem.setMnemonic('

S'

startItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));

//为端口设置快捷键为ctrl+T

stopItem.setMnemonic('

T'

stopItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));

//为退出设置快捷键为ctrl+x

exitItem.setMnemonic('

X'

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

//为帮助菜单栏设置热键'

H'

helpMenu.setMnemonic('

//为帮助设置快捷键为ctrl+p

helpItem.setMnemonic('

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

}

*程序初始化函数

publicvoidinit(){

ContainercontentPane=getContentPane();

contentPane.setLayout(newBorderLayout());

//添加菜单栏

serviceMenu.add(portItem);

serviceMenu.add(startItem);

serviceMenu.add(stopItem);

serviceMenu.add(exitItem);

jMenuBar.add(serviceMenu);

helpMenu.add(helpItem);

jMenuBar.add(helpMenu);

setJMenuBar(jMenuBar);

//初始化按钮

portSet=newJButton("

端口设置"

startServer=newJButton("

启动服务"

stopServer=newJButton("

停止服务"

);

exitButton=newJButton("

退出"

//将按钮添加到工具栏

toolBar.add(portSet);

toolBar.addSeparator();

//添加分隔栏

toolBar.add(startServer);

toolBar.add(stopServer);

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=newJComboBox();

combobox.insertItemAt("

所有人"

0);

combobox.setSelectedIndex(0);

messageShow=newJTextArea();

messageShow.setEditable(false);

//添加滚动条

messageScrollPane=newJScrollPane(messageShow,

JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,

JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

messageScrollPane.setPreferredSize(newDimension(400,400));

messageScrollPane.revalidate();

showStatus=newJTextField(35);

showStatus.setEditable(false)

sysMessage=newJTextField(24);

sysMessage.setEnabled(false);

sysMessageButton=newJButton();

sysMessageButton.setText("

发送"

//添加系统消息的事件侦听

sysMessage.addActionListener(this);

sysMessageButton.addActionListener(this);

sendToLabel=newJLabel("

发送至:

"

messageLabel=newJLabel("

发送消息:

downPanel=newJPanel();

girdBag=newGridBagLayout();

downPanel.setLayout(girdBag);

girdBagCon=newGridBagConstraints();

girdBagCon.gridx=0;

girdBagCon.gridy=0;

girdBagCon.gridwidth=3;

girdBagCon.gridheight=2;

girdBagCon.ipadx=5;

girdBagCon.ipady=5;

JLabelnone=newJLabel("

"

girdBag.setConstraints(none,girdBagCon);

downPanel.add(none);

girdBagCon.gridy=2;

girdBagCon.insets=newInsets(1,0,0,0);

girdBag.setConstraints(sendToLabel,girdBagCon);

downPanel.add(sendToLabel);

girdBagCon.gridx=1;

girdBagCon.anchor=GridBagConstraints.LINE_START;

girdBag.setConstraints(combobox,girdBagCon);

downPanel.add(combobox);

girdBagCon.gridy=3;

girdBag.setConstraints(messageLabel,girdBagCon);

downPanel.add(messageLabel);

girdBagCon.gridx=1;

girdBag.setConstraints(sysMessage,girdBagCon);

downPanel.add(sysMessage);

girdBagCon.gridx=2;

girdBag.setConstraints(sysMessageButton,girdBagCon);

downPanel.add(sysMessageButton);

girdBagCon.gridy=4;

girdBag.setConstraints(showStatus,girdBagCon);

downPanel.add(showStatus);

contentPane.add(messageScrollPane,BorderLayout.CENTER);

contentPane.add(downPanel,BorderLayout.SOUTH);

//关闭程序时的操作

this.addWindowListener(

newWindowAdapter(){

publicvoidwindowClosing(WindowEvente){

stopService();

System.exit(0);

}}}}

*事件处理

publicvoidactionPerformed(ActionEvente){

Objectobj=e.getSour

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

当前位置:首页 > 工程科技 > 电子电路

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

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