收藏 分销(赏)

java专业课程设计方案报告java聊天室.doc

上传人:精**** 文档编号:2496168 上传时间:2024-05-30 格式:DOC 页数:58 大小:229.54KB
下载 相关 举报
java专业课程设计方案报告java聊天室.doc_第1页
第1页 / 共58页
java专业课程设计方案报告java聊天室.doc_第2页
第2页 / 共58页
java专业课程设计方案报告java聊天室.doc_第3页
第3页 / 共58页
java专业课程设计方案报告java聊天室.doc_第4页
第4页 / 共58页
java专业课程设计方案报告java聊天室.doc_第5页
第5页 / 共58页
点击查看更多>>
资源描述

1、Java聊天室课程设计一、 需求分析1.1开发背景在信息化社会今天,网络飞速发展,大家对网络依靠越来越多,越来越离不开网络,由此而产生聊天工具越来越多,类似MSN、QQ,网络聊天时一类聊天系统发展日新月异,所以产生了制作一个类似QQ网络聊天工具想法,且经过制作该程序还能愈加好学习网络软件编程知识。网络编程目标就是指直接或间接地经过网络协议和其它计算机进行通讯。网编程中有两个关键问题,一个是怎样正确定位网络上一台或多台主机,另一个就是找到主机后怎样可靠高效进行数据传输。在TCP/IP协议中IP层关键负责网络主机定位,数据传输路由,由IP地址能够唯一地确定Internet上一台主机。而TCP层则提

2、供面向应用可靠或非可靠数据传输机制,这是网络编程关键对象,通常不需要关心IP层是怎样处理数据。现在较为流行网络编程模型是用户机/服务器(C/S)结构。即通信双方一方作为服务器等候用户提出请求并给予响应。用户则在需要服务时向服务器提出申请。服务器通常作为守护进程一直运行,监听网络端口,一旦有用户请求,就会开启一个服务进程来响应该用户,同时自己继续监听服务端口,使以后用户也得到响应服务。1.2设计要求本课程设计目标是利用套接字socket()设计一个聊天程序,该程序基于C/S模式,用户机器向服务器发聊天请求,服务器应答并能显示用户机发过来信息。1.3设计目标经过设计一个网络聊天程序,对套接字、数据

3、报通讯、URL、和URLConnectiom相关知识有具体了解和充足认识。能将相关只是利用到相关实践中去。1.4功效实现聊天室共分为用户端和服务端两部分,服务器程序关键负责侦听用户端发来消息,用户端需要登录到对应服务器才能够实现正常聊天功效。服务器关键功效有1) 在特定端口上进行侦听,等候用户连接2) 用户能够配置服务器真挺端口3) 向已经连接服务器用户发送系统消息4) 统计在线人数5) 当停止服务时,断开全部用户连接用户端关键功效1) 连接到已经开启聊天服务服务端2) 用户能够配置要连接服务器端ip地址和端口号3) 用户能够配置连接后显示用户名4) 当服务器开启时。用户能够随时登陆和注销5)

4、 用户能够向全部些人或一个人发送消息二、 总体设计2.1设计思想套接字对象在网络编程中饰演者关键角色,能够用套接字技术编写一个聊天室,服务器为每个用户开启一个线程。在该线程中经过套接字和用户交流信息,当用户向服务器发送一条聊天信息“大家好”时,服务器要让全部这些线程中输入流写入信息大家好,这么全部用户套接字输入流就全部读取到了这一条信息。假如把信息“你好”发送给特定用户,服务器就让特定线程中输出流写入信息“你好”,那么只有特定用户套机字输入流能够读取到这条信息。在聊天室中需要对用户上线下线状态进行修改,进而统计在线人数、查找某用户等。所以需要用到java链表来实现。因为Java语言不像c或c+

5、一样能够利用线性表链式存放结构,用节点和指针来表示,在Java中是没有指针,不过能够经过使用对象引用来实现链表。链表结点个数称为链表长度。所以在Java中能够定义两个类来实现链表操作,分别为节点类和链表类。在本设计中对用户存放就是利用链表来实现。2.2基础设计概念和处理步骤本系统运行用JAVA开发,采取CS结构,系统分为客服端和服务端两大模块,使用Socket类建立套接字实现客服端和服务端得通讯。处理步骤用户端服务端发送请求处理请求服务端 用户端一个ServerSocket对象和一个Socket对象 一个Socketd对象ServerSocket(port)创建ServerSocket对象提供

6、TCP连接服务Accept()在指定端口等候用户端连接请求连接成功,取得一个已连接socket对象InputStream读取Socket对象输入流OutputStream写入Socket对象输出流InputStream读取Socket对象输入流OutputStream写入Socket对象输出流Socket(host,port)创建Socket对象,向指定主机端口发出连接请求Socket.close()关闭TCP连接ServerSocket.close()停止提供TCP连接服务Socket.close()关闭TCP连接建立Socket连接申请连接经过流传送数据TCP Socket通信步骤2.3总

7、体结构网络聊天室服务端客服端2.4功效分配用户端向全部些人或一个人发送消息用户端连接服务端配置服务端登录和注销服务端服务端等候用户连接配置服务器侦听端口向用户发送系统消息统计在线人数、断开连接等2.5接口设计2.5.1用户接口提供一个用户操作界面:包含用户能够再界面中登录聊天室、输入消息、浏览聊天内容和聊天对象。同时提供一个服务器操作界面,经过服务器操作界面能够修改服务器配置,知道用户目前状态,并能够给用户发送指定系统信息。2.5.2内部接口Socket(string hont ,int port );用户端使用Socket类建立和服务器套接字连接。ServerSocket(int port)

8、;建立接收用户套接字服务器套接字。2.6关键模块2.6.1聊天室服务器端模块聊天室服务器端模块关键有以下几部分组成1、 主框架类(ChatServer.java)该文件包含名为ChatServerpublic类,其关键功效是定义服务器界面,添加事件侦听鱼事件处理。ChatServer类调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息转发。2、 服务器用户上线和下线侦听类。该类对用户上线和下线侦听是经过调用用户链表类来实现,当用户上线和下线情况发生改变时,该类会对主类界面进行对应修改。3、 服务器消息收发类该类分别定义了向某用户及向

9、全部些人发送消息方法,发送消息会显示在主界面类界面上。4用户修改配置类。该类继承自JDialog。使用户对服务器端口进行修改配置类。5节点类定义了链表中用户6链表类该类经过结构函数结构用户链表,定义了添加用户、删除用户、返回用户数、依据用户名查找用户和各依据索引查找用户等方法。7服务器帮助类、2.6.2聊天室服务器端模块算法描述ActionListenerChatServer-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTe

10、xtField+ ChatServer():public+init():public void +startService():public void+stopService():public void +sendStopToAll():public void+sendMsgToAll(String):public void+ sendSystemMessage():public voidJFrameThreadServerListen- server: ServerSocket- userLinkList :UserLinkList- isStop: public Boolean+Serve

11、rListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)ServerReceive-textarea:JTextArea- userLinkList :UserLinkList- isStop: public Boolean+ServerListen(ServerSocket,JComboBox,JTextArea,JTextField,UserLinkList)服务器端ChatServer类继承自JFrame并实现对应事件监听接口,所以它定义了服务器主框架,及各个按钮事件监听。它分别调用ServerListen类来实现

12、服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息转发。同时服务器能够响应多个用户请求,当一个用户发送请求时,服务器就为它增加一个线程,同时服务器利用UserLinkList类为用户端设置一个请求队列,假如服务器不能立即响应用户端请求,就要把这个请求放到请求队列在中,等服务器将目前请求处理完,会自动到请求队列中根据前后次序取出请求进行处理。2.6.3聊天室用户端模块用户端关键有以下多个文件,功效以下:1用户端主框架类该类关键定义用户端界面,添加事件侦听和事件处理。该类定义了和服务器实现连接和断开连接方法。当用户登录到指定服务器上时,该类条用用户端实现消息收发类实现消息

13、收发。同时该类定义了向全部用户发送消息方法。2用户端消息收发类该类实现了服务器和用户端消息收发3用户修改配置类该类继承自JDialog,是用户对要连接服务器IP及侦听端口进行修改配置类。4帮助类用户端用户程序帮助类2.6.4聊天室用户端模块关键算法描述ActionListenerChatClient-port:public static in-serverSocket:ServerSocket-messageShow:JTextArea-userLinkList:UserLinkList-showStatus:JTextField+ ChatClient():public+init():pub

14、lic void +Connect():public void+DisConnect():public void +SendMessage():public void JFrameThreadClientReceive- socket: Socket-output:ObjectOutputStream-input:ObjectInputStream +ClientReceive(Socket,ObjectOutputStream,ObjectIn JComboBox,JTextArea,JTextField )用户端ChatClient类继承了JFrame并实现对应事件监听接口。它实现了用户端

15、主界面及对应按钮事件侦听。该类调用ClientReceive类实现消息收发。同时该类定义了向全部用户发送消息方法。经过对应输入输出流和服务器进行数据传输和交流。三、 关键代码实现3.1服务器关键代码实现1、Chatserver类:包含名为ChatServerpublic类,其关键功效为定义服务器端界面,添加事件侦听和事件处理。调用ServerListen类来实现服务端用户上线和下线侦听,调用ServerReceive类来实现服务器端消息收发。import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.s

16、wing.event.*;import .*;import java.io.*;/* * 聊天服务端主框架类 */public class ChatServer extends JFrame implements ActionListenerpublic static int port = 8888;/服务端侦听端口ServerSocket serverSocket;/服务端SocketImage icon;/程序图标JComboBox combobox;/选择发送消息接收者JTextArea messageShow;/服务端信息显示JScrollPane messageScrollPane;

17、/信息显示滚动条JTextField showStatus;/显示用户连接状态JLabel sendToLabel,messageLabel;JTextField sysMessage;/服务端消息发送JButton sysMessageButton;/服务端消息发送按钮UserLinkList userLinkList;/用户链表/建立菜单栏JMenuBar jMenuBar = new JMenuBar(); /建立菜单组JMenu serviceMenu = new JMenu (服务(V); /建立菜单项JMenuItem portItem = new JMenuItem (端口设置(

18、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;/开启

19、服务端侦听JButton stopServer;/关闭服务端侦听JButton exitButton;/退出按钮/框架大小Dimension faceSize = new Dimension(400, 600);ServerListen listenThread;JPanel downPanel ;GridBagLayout girdBag;GridBagConstraints girdBagCon;/* * 服务端结构函数 */public ChatServer()init();/初始化程序/添加框架关闭事件处理this.setDefaultCloseOperation(JFrame.EXI

20、T_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(聊天室服务端);

21、 /设置标题/程序图标icon = getImage(icon.gif);this.setIconImage(icon); /设置程序图标show();/为服务菜单栏设置热键VserviceMenu.setMnemonic(V);/为端口设置快捷键为ctrl+pportItem.setMnemonic (P); portItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_P,InputEvent.CTRL_MASK);/为开启服务快捷键为ctrl+sstartItem.setMnemonic (S); startItem.setAc

22、celerator (KeyStroke.getKeyStroke (KeyEvent.VK_S,InputEvent.CTRL_MASK);/为端口设置快捷键为ctrl+TstopItem.setMnemonic (T); stopItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_T,InputEvent.CTRL_MASK);/为退出设置快捷键为ctrl+xexitItem.setMnemonic (X); exitItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK

23、_X,InputEvent.CTRL_MASK);/为帮助菜单栏设置热键HhelpMenu.setMnemonic(H);/为帮助设置快捷键为ctrl+phelpItem.setMnemonic (H); helpItem.setAccelerator (KeyStroke.getKeyStroke (KeyEvent.VK_H,InputEvent.CTRL_MASK);/* * 程序初始化函数 */public void init()Container contentPane = getContentPane();contentPane.setLayout(new BorderLayout

24、();/添加菜单栏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

25、 JButton(停止服务 );exitButton = new JButton(退出 );/将按钮添加到工具栏toolBar.add(portSet);toolBar.addSeparator();/添加分隔栏toolBar.add(startServer);toolBar.add(stopServer);toolBar.addSeparator();/添加分隔栏toolBar.add(exitButton);contentPane.add(toolBar,BorderLayout.NORTH);/初始时,令停止服务按钮不可用stopServer.setEnabled(false);stop

26、Item .setEnabled(false);/为菜单栏添加事件监听portItem.addActionListener(this);startItem.addActionListener(this);stopItem.addActionListener(this);exitItem.addActionListener(this);helpItem.addActionListener(this);/添加按钮事件侦听portSet.addActionListener(this);startServer.addActionListener(this);stopServer.addActionLi

27、stener(this);exitButton.addActionListener(this);combobox = new JComboBox();combobox.insertItemAt(全部些人,0);combobox.setSelectedIndex(0);messageShow = new JTextArea();messageShow.setEditable(false);/添加滚动条messageScrollPane = new JScrollPane(messageShow,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPan

28、e.HORIZONTAL_SCROLLBAR_AS_NEEDED);messageScrollPane.setPreferredSize(new Dimension(400,400);messageScrollPane.revalidate();showStatus = new JTextField(35);showStatus.setEditable(false)sysMessage = new JTextField(24);sysMessage.setEnabled(false);sysMessageButton = new JButton();sysMessageButton.setTe

29、xt(发送);/添加系统消息事件侦听sysMessage.addActionListener(this);sysMessageButton.addActionListener(this);sendToLabel = new JLabel(发送至:);messageLabel = new JLabel(发送消息:);downPanel = new JPanel();girdBag = new GridBagLayout();downPanel.setLayout(girdBag);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0

30、;girdBagCon.gridy = 0;girdBagCon.gridwidth = 3;girdBagCon.gridheight = 2;girdBagCon.ipadx = 5;girdBagCon.ipady = 5;JLabel none = new JLabel( );girdBag.setConstraints(none,girdBagCon);downPanel.add(none);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 2;girdBagCon.insets

31、 = new Insets(1,0,0,0);girdBagCon.ipadx = 5;girdBagCon.ipady = 5;girdBag.setConstraints(sendToLabel,girdBagCon);downPanel.add(sendToLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx =1;girdBagCon.gridy = 2;girdBagCon.anchor = GridBagConstraints.LINE_START;girdBag.setConstraints(combobox,

32、girdBagCon);downPanel.add(combobox);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 3;girdBag.setConstraints(messageLabel,girdBagCon);downPanel.add(messageLabel);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 1;girdBagCon.gridy = 3;girdBag.setConstraints(sysMe

33、ssage,girdBagCon);downPanel.add(sysMessage);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 2;girdBagCon.gridy = 3;girdBag.setConstraints(sysMessageButton,girdBagCon);downPanel.add(sysMessageButton);girdBagCon = new GridBagConstraints();girdBagCon.gridx = 0;girdBagCon.gridy = 4;girdBagCon.g

34、ridwidth = 3;girdBag.setConstraints(showStatus,girdBagCon);downPanel.add(showStatus);contentPane.add(messageScrollPane,BorderLayout.CENTER);contentPane.add(downPanel,BorderLayout.SOUTH);/关闭程序时操作this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent e)stopService();System.exi

35、t(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,真停止服务吗?,停止服务,JOptionPane.YES_OPTION,JOptionPane.QUESTION_MES

36、SAGE);if (j = JOptionPane.YES_OPTION)stopService();else if (obj = portSet | obj = portItem) /端口设置/调出端口设置对话框PortConf portConf = new PortConf(this);portConf.show();else if (obj = exitButton | obj = exitItem) /退出程序int j=JOptionPane.showConfirmDialog(this,真要退出吗?,退出,JOptionPane.YES_OPTION,JOptionPane.QUE

37、STION_MESSAGE);if (j = JOptionPane.YES_OPTION)stopService();System.exit(0);else if (obj = helpItem) /菜单栏中帮助/调出帮助对话框Help helpDialog = new Help(this);helpDialog.show();else if (obj = sysMessage | obj = sysMessageButton) /发送系统消息sendSystemMessage();/* * 开启服务端 */public void startService()tryserverSocket

38、= new ServerSocket(port,10);messageShow.append(服务端已经开启,在+port+端口侦听.n);startServer.setEnabled(false);startItem.setEnabled(false);portSet.setEnabled(false);portItem.setEnabled(false);stopServer .setEnabled(true);stopItem .setEnabled(true);sysMessage.setEnabled(true);catch (Exception e)/System.out.prin

39、tln(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.ge

40、tCount();int i =0;while( i count)Node node = userLinkList.findUser(i);node.input .close();node.output.close();node.socket.close();i +;stopServer .setEnabled(false);stopItem .setEnabled(false);startServer.setEnabled(true);startItem.setEnabled(true);portSet.setEnabled(true);portItem.setEnabled(true);s

41、ysMessage.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 count)Node node = userLinkList.findUser(i);if(node

42、 = null) i +;continue;trynode.output.writeObject(服务关闭);node.output.flush();catch (Exception e)/System.out.println($+e);i+;/* * 向全部些人发送消息 */public void sendMsgToAll(String msg)int count = userLinkList.getCount();/用户总数int i = 0;while(i count)Node node = userLinkList.findUser(i);if(node = null) i +;continue;trynode.output.writeObject(系统信息);node.output.flush();node.output.writeObject(msg);node.output.flush();catch (Exception e)/System.out

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 通信科技 > 开发语言

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服