聊天室程序设计报告题目:聊天室程序设计院系名称:专业名称:班级:学生姓名:****学号(8位):*******指导教师:一.设计目的在当今信息时代,越来越多的聊天工具被应用,java语言是当今流行的网络编程语言,它具有面向对象,与平台无关,安全,多线程等特点。使用java语言不仅可以实现大型企业级的分布式应用系统,还能够为小型的的,嵌入式设备进行应用程序的开发。面向对象的开发是当今世界最流行的开发方法,它不仅具有更贴近自然地语义,而且有利于软件的维护和继承,锻炼我们熟练地应用面向对象的思想和设计方法解决实际问题的能力。此次设计的题目为聊天室,可以巩固所学的java语言基础知识,增进java语言的编辑基本功,拓宽常用类库的应用,使我们通过教学环节与手段,把所学的课程及相关知识加以融会贯通,全面掌握java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。二.设计内容运用java程序编写聊天室,实现简单的聊天功能。它是图形界面,线程,流与文件系统等技术的综合应用。其界面主要采用了java.awt包,java.swing包等。程序实现了聊天室的基本功能,其中有:1.启动服务器。2.启动登陆界面。3.进入客户端界面。4.发送信息。5.离开客户端界面。6.关闭服务器。三.概要设计1.首先通过继承JFrame类构造服务器界面。使服务器能够为每一个客户启动一个线程,记录客户的上下线行为、登陆的ip,放送消息的时刻,监视客户的聊天记录,对于出现不文明的话语,在客户端进行屏蔽,并统计出现不文明话语的次数,超过三次提示警告信息,并将其踢出聊天室。2.设计客户端程序使其能够完成正常的通信功能,并且可以更改背景颜色,设置字体颜色。3.设计登录程序,使其显示登录的ip地址端口号,以及用户昵称,通过登录按钮可以调用客户端程序,实现聊天功能。1.功能模块图;2.各个模块详细的功能描述。1,服务器端功能描述:记录用户的上下线,显示系统时间,显示在线用户的用户名和ip地址,监听客户的聊天记录,刷新列表,启动服务,对于重复启动,显示警告信息,屏蔽用户的不文明言语,对于多次使用不文明用语的用户将其踢出聊天室,并向客户端放送相应信息。向个客户端广播系统消息。2.登录界面显示登录的端口号,ip地址,昵称,通过按动登录按钮进入客户端界面,或取消登录操作。3.客户端功能描述;显示登录昵称,显示聊天记录,更改背景颜色,设置字体颜色,放送信息,关闭聊天窗口。四.详细设计程序中引入的包:importjava.net.*;importjava.io.*;importjava.util.*;importjava.awt.event.*;importjava.awt.*;importjavax.swing.*;服务器端代码中用户自定义的类:类名;server作用:服务器的启动继承的类:JFrame,构造服务器界面。定义的对象:TextArea文本域java.awt.List在线客户列表ServerSocket服务器Socket客户端主要的成员方法:voidinit()构造服务器端的界面publicvoidactionPerformed(ActionEvente)按钮监听器publicvoidkeyPressed(KeyEvente)键盘监听器类名:start作用:启动服务器的线程继承的类名:thread主要的成员方法:publicvoidrun()启动服务器的线程类名;SgService继承的类名:thread主要的成员方法:publicvoidrun()处理单个客户的线程(2)用户登录相关的类:类名:login作用:构造登录界面继承的类:JFrame实现的接口:ActionListener构造方法;publicLogin()主要的成员方法:publicvoidactionPerformed(ActionEvente)实现登录和取消按钮的监听器类名:LoginStart继承的类:Thread主要的方法;publicvoidrun()作用:如果登录成功,则弹出客户端聊天窗口,如果登录失败,则打印出登录失败,以告知客户(3)客户端相关的类类名:Client继承的类:JFrame构造方法;publicClient(PrintStreamout,BufferedReaderin,Stringname)主要的成员方法:publicvoidreceive()接受服务端发来的信息1.功能函数的调用关系图2.各功能函数的数据流程图互相通信3.重点设计及编码//聊天室服务器importjava.net.*;importjava.io.*;服务器端开放端口,等待客户端连接接收客户端请求。监听客户端的通信客户端A发送信息客户下线结束客户端B发送信息importjava.util.*;importjava.awt.event.*;importjava.awt.*;importjavax.swing.*;classServerextendsJFrame{privateTextAreamsgA=newTextArea();//服务器用来输入的文本域privateTextAreaarea=newTextArea();//服务器显示消息的文本域privateTextFieldportT=newTextField(8888);privatejava.awt.Listlist=newjava.awt.List();//在线客户列表privateServerSocketserver;//服务器privateSocketclient;//客户端privateMapString,Socketcontainer=newHashMapString,Socket();//HashMapvoidinit(){//设置几个面板//Panelp1=newPanel();Panelp2=newPanel();Panelp3=newPanel();Panelp4=newPanel();Panelp5=newPanel();Panelp6=newPanel();Panelp7=newPanel();Panelp8=newPanel();Panelp9=newPanel();Panelp10=newPanel();//设置两个主要的文本框Labellb1=newLabel(服务器界面);lb1.setBackground(newColor(250,120,150));Labellb2=newLabel(port);BorderLayoutborder1=newBorderLayout();p1.setLayout(border1);p1.add(BorderLayout.CENTER,area);BorderLayoutborder2=newBorderLayout();p5.setLayout(border2);p5.add(BorderLayout.NORTH,p3);p5.add(BorderLayout.CENTER,msgA);BorderLayoutborder3=newBorderLayout();p7.setLayout(border3);p7.add(BorderLayout.CENTER,p1);p7.add(BorderLayout.SOUTH,p5);p7.setBackground(newColor(250,150,200));JButtonstartButton=newJButton(启动服务);JButtonsendButton=newJButton(发送);JButtonflushButton=newJButton(刷新列表);FlowLayoutfl=newFlowLayout(FlowLayout.LEFT);p8.setLayout(fl);p8.add(lb2);p8.add(portT);p8.add(startButton);p8.add(sendButton);p8.add(flushButton);p8.setBackground(newColor(250,120,150));BorderLayoutborder4=newBorderLayout();p9.setLayout(border4);p9.add(BorderLayout.CENTER,p7);p9.add(BorderLayout.SOUTH,p8);p10.setLayout(newBorderLayout());Labellb3=newLabel(在线用户);lb3.setBackground(newColor(250,120,150));p10.add(lb3,BorderLayout.NORTH);p10.add(list,BorderLayout.CENTER);area.setEditable(false);BorderLayoutborder=newBorderLayout();this.addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventarg0){System.exit(0);}});this.setLayout(border);this.add(BorderLayout.NORTH,lb1);this.add(BorderLayout.CENTER,p9);this.add(BorderLayout.EAST,p10);this.setTitle(聊天服务器);this.setBounds(100,100,600,550);this.setVisible(true);//启动服务按钮监听器startButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){Threadt=newStart();t.start();}});//启动按钮监听器----end//发送按钮监听器sendButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){Stringmsg=msgA.getText();if(msg!=null&&msg!=){//如果消息不为空Calendarca=newGregorianCalendar();inthh=ca.get(Calendar.HOUR_OF_DAY);intmm=ca.get(Calendar.MINUTE);intss=ca.get(Calendar.SECOND);Stringtime=newString(hh+:+mm+:+ss+);broadcast(time+[系统消息]:+msg);//那么广播这条系统消息area.append(time+[系统消息]:+msg+\n);msgA.setText();}}});//end//刷新按钮监听器flushButton.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){if(list!=null){list.removeAll();//清空在线用户列表,以便刷新}SetMap.EntryString,SocketmySet=container.entrySet();for(IteratorMap.EntryString,Socketit=mySet.iterator();it.hasNext();){//刷新列表Map.EntryString,Socketme=it.next();StringaClientName=me.getKey();SocketaClient=me.getValue();StringaClientAddress=aClient.g