




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java网络编程实践(基于C/S的控制台聊天室 )课程设计说明书课程名称:Java网络课程实践题目:基于C/S的控制台聊天室姓名:董丽蓉学号:200905143教学班号:01指导教师:王小刚兰州交通大学软件科学与工程系二一一 年 月 日任务书:题目 3:基于C/S的控制台聊天室(1人)实现几个客户端的群聊(在控制台窗口显示聊天信息),信息经服务端转发和群发,多客户端使用多线程。基于Socket。注意:在每一个客户端窗口要显示所有参与聊天者的聊天内容,包括谁发言及发言内容。文档内容要求:1、在做上述题目时,正文要求包含4部分内容:1)项目简述和目的 2)解题基本思路;3)分析和设计 4)主要程序
2、源代码;5)运行截图;5)总结和体会2、文档装订顺序:1)封面;2)任务书;3)团队成员及分工列表;3)正文。3、打印格式要求:纸型:B5页边距:上2.54cm;下2.54cm;左2.2cm;右1.9cm;装订线为0字体、格式要求: 题目:2号黑体不加粗,居中,段前段后间距1行。子标题字体为4号黑体。所有的子标题均加粗,置于页面最左端,段前段后间距均设为0.5行。文章正文皆为5号宋体,行距为固定值22磅,字距为标准。图、表的标题文字采用小5号黑体,表中的文字采用小5号宋体基于C/S的控制台聊天室设计目的巩固所学的Java语言基础知识,增进Java语言的编辑基本功,拓展常用类库的应用,使我们通过
3、教学环节与手段,把所学的课程及相关知识加以融会贯通, 二、设计内容运用Java程序编写聊天室,实现简单的聊天功能。它是图形界面,线程,流与文件系统等技术的综合应用。其界面主要采用了Java.awt包,Java.swing包等。程序实现了聊天室的基本功能,其中有:启动服务器。启动登录界面。进入客户端界面。发送信息。离开客户端界面。关闭服务器。分析1.首先通过继承JFrame类构造服务器界面。使服务器能够为每一个客户启动一个线程,记录客户的上下线行为、登录的IP,发送消息的时刻,监视客户的聊天记录,对于出现不文明的话语,在客户端进行屏蔽,并统计出现不文明用语的次数,超过三次提示警告信息,并将其踢出
4、聊天室。2.设计客户端程序使其能够完成正常的通信功能,并且可以更改背景颜色,设置字体颜色。3.设计登录程序,使其显示登录的IP地址端口号,以及用户昵称,通过登录按钮可以调用客户端程序,实现;聊天功能。四、详细设计程序中引入的包:import .*;import java.io.*;import java.util.*;import java.awt.event.*;import java.awt.*;import java.javax.swing.*;服务器端代码中用户自定义的类:类名:Server作用:服务器的启动继承的类:JFrame,构造服务器界面。定义的对象:TextArea 文本域J
5、ava.awt.List 在线客户列表SeverSocket 服务器Socket 客户端 主要成员方法:void init() 构造服务器端的界面public void actionPerformed(ActionEvent e) 按钮监听器public void keyPressed(KeyEvent e) 键盘监听器类名:start作用:启动服务器的线程继承的类名:thread主要的成员方法:Public void run() 启动服务器的线程类名:SgService继承的类名:thread主要的成员方法: public void run() 处理单个客户的线程用户登录相关的类:类名:lo
6、gin作用:构造登录界面继承的类:JFrame实现的接口:ActionListener构造方法:public login()主要的成员方法:public void actionPerformed(ActionEvent e) 实现登录和取消按钮的监听器类名:loginStart继承的类:thread主要的方法:public void run()作用:如果登录成功,则弹出客户端聊天窗口,如果登录失败,则打印出登录失败,以告知客户客户端相关的类:类名:Client继承的类:JFrame实现的接口:ActionListener构造方法:public Client(PrintStream out,Bu
7、fferedReader in,String name)主要的成员方法:public void receive() 接受服务端发来的信息五.主要程序源代码/聊天室服务器import .*;import java.io.*;import java.util.*;import java.awt.event.*;import java.awt.*;import javax.swing.*;class Server extends JFrameprivate TextArea msgA=new TextArea(); /服务器用来输入用的文本域private TextArea area=new Tex
8、tArea(); /服务器显示消息的文本域private TextField portT=new TextField(8888);private java.awt.List list=new java.awt.List(); /在线客户列表private ServerSocket server;/服务器private Socket client; /客户端private Map container=new HashMap(); /HashMapvoid init()Panel p1=new Panel();Panel p2=new Panel();Panel p3=new Panel();Pa
9、nel p4=new Panel();Panel p5=new Panel();Panel p6=new Panel();Panel p7=new Panel();Panel p8=new Panel();Panel p9=new Panel();Panel p10=new Panel();/设置两个重要的文本框Label lb1=new Label(服务器界面);lb1.setBackground(new Color(250,120,150);Label lb2=new Label(port);BorderLayout border1=new BorderLayout();p1.setLay
10、out(border1);p1.add(BorderLayout.CENTER,area);BorderLayout border2=new BorderLayout();p5.setLayout(border2);p5.add(BorderLayout.NORTH,p3);p5.add(BorderLayout.CENTER,msgA);BorderLayout border3=new BorderLayout();p7.setLayout(border3);p7.add(BorderLayout.CENTER,p1);p7.add(BorderLayout.SOUTH,p5);p7.set
11、Background(new Color(250,150,200);JButton startButton=new JButton(启动服务);JButton sendButton=new JButton(发送);JButton flushButton=new JButton(刷新列表);FlowLayout f1=new FlowLayout(FlowLayout.LEFT);p8.setLayout(f1);p8.add(lb2);p8.add(portT);p8.add(startButton);p8.add(sendButton);p8.add(flushButton);p8.setB
12、ackground(new Color(250,120,150);BorderLayout border4=new BorderLayout();p9.setLayout(border4);p9.add(BorderLayout.CENTER,p7);p9.add(BorderLayout.SOUTH,p8);p10.setLayout(new BorderLayout();Label lb3=new Label(在线用户);lb3.setBackground(new Color(250,120,150);p10.add(lb3,BorderLayout.NORTH);p10.add(list
13、,BorderLayout.CENTER);area.setEditable(false);BorderLayout border=new BorderLayout();this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0)System.exit(0););this.setLayout(border);this.add(BorderLayout.NORTH,lb1);this.add(BorderLayout.CENTER,p9);this.setTitle(聊天服务器);thi
14、s.setBounds(100,100,600,550);this.setVisible(true);/“启动服务”按钮监听器startButton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)Thread t=new Start();t.start(););/启动服务按钮监听器/发送按钮监听器sendButton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)Str
15、ing msg =msgA.getText();if(msg!=null& msg!=)/如果消息不为空Calendar ca=new GregorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.MINUTE);int ss=ca.get(Calendar.SECOND);String time=new String(hh+:+mm+:+ss+);broadcast(time +系统消息:+msg); /那么广播这条消息area.append(time+系统消息:+msg+n);msgA.setT
16、ext(););/end/刷新按钮监听器flushButton.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)if(list!=null)list.removeAll(); /清空在线用户列表,以便刷新SetMap.Entry mySet=container.entrySet(); for(IteratorMap.Entry it=mySet.iterator();it.hasNext();)/刷新列表Map.Entry me=it.next();String aClientNam
17、e=me.getKey();Socket aClient=me.getValue();String aClientAddress=aClient.getInetAddress().getHostAddress();list.add(aClientName+-+aClientAddress););msgA.addKeyListener(new KeyAdapter()/从键盘监听器-按下Enter发送消息public void keyPressed(KeyEvent e)int value=e.getKeyCode();if(value=KeyEvent.VK_ENTER)String msg=
18、msgA.getText();Calendar ca=new GregorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.MINUTE);int ss=ca.get(Calendar.SECOND);String time=new String(hh+:+mm+:+ss+);broadcast(time +系统消息:+msg); /那么广播这条消息area.append(time+系统消息:+msg+n);msgA.setText(););class Start extends Thread /启
19、动服务器的线程public void run()tryif(server!=null& !server.isClosed()area.append(警告!服务器已在启动中!n);elseserver=new ServerSocket(Integer.parseInt(portT.getText();/启动服务器area.append(new Date().toString()+n+恭喜!(*_*) 嘻嘻+服务器启动成功!+nn );while(true)client=server.accept();Thread sgS=new SgService(client); /为每位登录的客户创建一个线
20、程 sgS.start(); /启动客户线程catch(Exception e)System.out.println(cuowu 1);e.printStackTrace();/处理单个客户的线程class SgService extends Threadprivate Socket client=null;/客户套接字private BufferedReader br=null;/输入流private PrintStream ps=null;private int counter=0;/记录是第几次接受用户的信息private int mark=0;/记录用户说不文明用语的次数private
21、 String name=null;SgService(Socket client)/构造方法this.client=client;public void run()/run-begintrybr=new BufferedReader(new InputStreamReader(client.getInputStream();ps=new PrintStream(client.getOutputStream();String msg=null;while(msg=br.readLine()!=null)/无限循环意味着可以和用户进行无限次交互if(counter=0)name= msg;con
22、tainer.put(name,client);list.add(name+-+client.getInetAddress().getHostAddress();Calendar ca=new GregorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.SECOND);String time=hh+:+mm+:+;broadcast(time+name+上线了!nn);counter+;elseif(msg.equals(你是个笨蛋)mark=mark+1;if(mark3)Calendar ca
23、=new GregorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.MINUTE);int ss=ca.get(Calendar.SECOND);String time=new String(hh+:+mm+:+ss+);singleCom(time+系统消息:警告,请注意文明用语!,client);area.append(time+系统消息:+name+第+mark+次使用了不文明用语,特此警告!);else/如果客户第三次说不文明的话,系统就把他踢出聊天室Calendar ca=new Gr
24、egorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.MINUTE);int ss=ca.get(Calendar.SECOND);String time=new String(hh+:+mm+:+ss+);if(mark=3)singleCom(time+系统消息:+name+由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!,client);/告诉他本人removeClient(name,client);/从系统列表中删除这个人的信息/并向所有人广播这一消息broadcast(time
25、+系统消息:+name+由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!n);area.append(time+系统消息:+name+由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!);elseCalendar ca=new GregorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.MINUTE);int ss=ca.get(Calendar.SECOND);String time=new String(hh+:+mm+:+ss+);area.append(time+name+说
26、+msg+nn);/同时向每个在线客户广播这则消息catch(Exception ex)Calendar ca=new GregorianCalendar();int hh=ca.get(Calendar.HOUR_OF_DAY);int mm=ca.get(Calendar.MINUTE);int ss=ca.get(Calendar.SECOND);String time=new String(hh+:+mm+:+ss+);area.append(time+name+下线了!n);broadcast(time+name+下线了!n);list.remove(name+-+client.ge
27、tInetAddress().getHostAddress();container.remove(name);void removeClient(String name,Socket client)list.remove(name+-+client.getInetAddress().getHostAddress();container.remove(name);void broadcast(String msg)/broadcast-beginSetMap.Entry mySet=container.entrySet();IteratorMap.Entry it=mySet.iterator(
28、);String message=msg;while(it.hasNext()/如果列表中还有客户Map.Entry me=it.next();Socket tempClient=me.getValue();singleCom(message,tempClient);/就把消息发给这个客户/向单个客户发送消息private void singleCom(String msg,Socket aClient)/singleCommunition-begintryPrintStream pw=new PrintStream(aClient.getOutputStream();String messa
29、ge=msg;pw.println(msg);catch(Exception ex)ex.printStackTrace();public static void main(String args)new Server().init();/启动服务器窗口System.out.println(服务器);/聊天室客户端import java.awt.event.*;import javax.swing.*;import java.io.*;import .*;import java.awt.*;class Client extends JFramePrintStream out;/输出流Buffe
30、redReader in;/输入流String name;TextArea area=new TextArea();TextArea msgA=new TextArea();TextField frdNameT=new TextField(10);List list=new List();Panel p10=new Panel();JButton sendButton=new JButton(发送);JButton closeButton=new JButton(关闭);JButton jb1=new JButton(设置字体颜色);JButton jb2=new JButton(设置背景颜色
31、);Label lb1=new Label(昵称);void init()this.pack();/设置几个面板Panel p1=new Panel();Panel p2=new Panel();Panel p3=new Panel();Panel p4=new Panel();Panel p5=new Panel();Panel p6=new Panel();Panel p7=new Panel();Panel p8=new Panel();Panel p9=new Panel();lb1.setBackground(Color.pink);/设置两个主要的文本框BorderLayout b
32、order1=new BorderLayout();p1.setLayout(border1);p1.add(BorderLayout.CENTER,area);area.setEditable(false);FlowLayout f2=new FlowLayout(FlowLayout.LEFT);p3.setLayout(f2);p3.add(jb1);p3.add(jb2);BorderLayout border2=new BorderLayout();p5.setLayout(border2);p5.add(BorderLayout.NORTH,p3);p5.add(BorderLay
33、out.CENTER,msgA);p5.setBackground(Color.pink);BorderLayout broder3=new BorderLayout();p7.setLayout(broder3);p7.add(BorderLayout.CENTER,p1);p7.add(BorderLayout.SOUTH,p5);FlowLayout f1=new FlowLayout(FlowLayout.RIGHT);p8.setLayout(f1);p8.add(sendButton);p8.add(closeButton);p8.setBackground(Color.pink)
34、;BorderLayout broder4=new BorderLayout();p9.setLayout(broder4);p9.add(BorderLayout.CENTER,p7);p9.add(BorderLayout.SOUTH,p8);/窗口关闭this.addWindowListener(new WindowAdapter()public void windowClosing(WindowEvent arg0)System.exit(0););BorderLayout broder5=new BorderLayout();p10.setLayout(broder5);p10.ad
35、d(BorderLayout.CENTER,list);p10.setBackground(Color.blue);/添加字体颜色的监听器jb1.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)JColorChooser chooser4=new JColorChooser();Color color=chooser4.showDialog(Client.this,我的调色盘,Color.yellow);area.setForeground(color);msgA.setForegr
36、ound(color);list.setForeground(color););jb2.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)JColorChooser chooser4=new JColorChooser();Color color=chooser4.showDialog(Client.this,我的调色盘,Color.yellow);area.setBackground(color););BorderLayout border=new BorderLayout();th
37、is.setLayout(border);this.add(BorderLayout.NORTH,lb1);this.add(BorderLayout.CENTER,p9);this.add(BorderLayout.EAST,p10);this.setTitle(聊天室客户端);this.setSize(700,600);this.setVisible(true);sendButton.addActionListener(new ActionListener()/“发送”按钮监听器public void actionPerformed(ActionEvent e)String msg =ms
38、gA.getText();msgA.setText();/清空输入文本域out.println(msg););msgA.addKeyListener(new KeyAdapter()/键盘监听器-按下enter发送信息public void keyPressed(KeyEvent e)int value=e.getKeyCode();if(value=KeyEvent.VK_ENTER)String msg=msgA.getText();msgA.setText();/清空文本域out.println(msg););closeButton.addActionListener(new Actio
39、nListener()/关闭监听器public void actionPerformed(ActionEvent e)System.exit(100););public Client(PrintStream out,BufferedReader in,String name)/构造方法this.out=out;this.in=in;=name;lb1.setText(昵称:+name);init();/弹出客户端窗口out.println(name);receive();/开始与服务器通信public void receive()/接收服务器端发来的信息tryString t
40、ext=null;while(text=in.readLine()!=null)this.area.append(text+n);/在area上读入的内容catch(IOException e)e.printStackTrace();/TODO Auto-generated catch blockfinallytryin.close();out.close();catch(Exception ex)ex.printStackTrace();/登录界面import javax.swing.*;import java.awt.*;import java.awt.event.*;import jav
41、a.io.*;import .*;class login extends JFrame implements ActionListenerTextField txtPort;TextField txtIP;TextField txtName;JButton btnLogin;JButton btnCancel;Socket toServer;BufferedReader in;PrintStream out;public login()Panel p1=new Panel();Panel p2=new Panel();Panel p3=new Panel();Panel p4=new Pane
42、l();Panel p5=new Panel(); Label l1=new Label(port); Label l2=new Label(IP); Label l3=new Label(昵称); txtPort=new TextField(8888,15); txtIP=new TextField(,15); txtName=new TextField(小敏,15); p2.add(l1); p2.add(txtPort); p3.add(l2); p3.add(txtIP); p4.add(l3); p4.add(txtName); GridLayout g=new GridLayout(3,1);/三行一列的网格布局管理器 p1.setLayout(g);/设置布局管理器 p1.add(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年美容师高级护理技能测试卷:美容师实操技能考核要点分析
- 大学生秋游活动策划范文6篇合集
- 社区者考试试题及答案
- 学法加分考试试题及答案
- 乐学星级考试试题及答案
- 科技绘图考试试题及答案
- 都江堰公务员试题及答案
- 安徽省蚌埠市2023届高三第二次教学质量检查考试文综政治无答案
- 重庆市黔江中学2023-2024学年高一上学期12月月考地理 含解析
- 2023届四川省绵阳市高三上学期二诊模拟考试理综生物试题 含解析
- 2025年江苏省江宁城建集团招聘笔试参考题库含答案解析
- 大学生就业与创业指导知到智慧树章节测试课后答案2024年秋辽宁广告职业学院
- 题型04 化学工艺流程题-【好题汇编】备战2024-2025学年高一化学上学期期末真题分类汇编(江苏专用)
- 高钛渣及其产品深加工项目的可行性研究报告
- 2024年中国黄油行业供需态势及进出口状况分析
- 三下26《和拖延的坏朋友说再见》心理健康教学设计
- 2025届山东省潍坊市高考英语二模试卷含解析
- 2023无人机系统测评规范
- 期中试题(含答案) 2024-2025学年北师大版数学八年级下册
- 明朝那些事读书分享
- 贯彻《中小学生守则》实施方案
评论
0/150
提交评论