版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java网络编程实践(基于c/s的控制台聊天室 )课程设计说明书课程名称:java网络课程实践题目:基于c/s的控制台聊天室姓名:学号:教学班号:01指导教师: 兰州交通大学软件科学与工程系二一一 年 月 日任务书:题目 3:基于c/s的控制台聊天室(1人)实现几个客户端的群聊(在控制台窗口显示聊天信息),信息经服务端转发和群发,多客户端使用多线程。基于socket。注意:在每一个客户端窗口要显示所有参与聊天者的聊天内容,包括谁发言及发言内容。文档内容要求:1、在做上述题目时,正文要求包含4部分内容:1)项目简述和目的 2)解题基本思路;3)分析和设计 4)主要程序源代码;5)运行截图;5)总
2、结和体会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. 启动服务器。2. 启动登录界面。3. 进入客户端界面。4. 发送信息。5. 离开客户端界面。6. 关闭服务器。三、 分析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.*;1) 服务器端代码中用户自定义的类:类名:server作用:服务器的启动继承的类:
5、jframe,构造服务器界面。定义的对象:textarea 文本域java.awt.list 在线客户列表seversocket 服务器socket 客户端 主要成员方法:void init() 构造服务器端的界面public void actionperformed(actionevent e) 按钮监听器public void keypressed(keyevent e) 键盘监听器类名:start作用:启动服务器的线程继承的类名:thread主要的成员方法:public void run() 启动服务器的线程类名:sgservice继承的类名:thread主要的成员方法: public
6、void run() 处理单个客户的线程2) 用户登录相关的类:类名:login作用:构造登录界面继承的类:jframe实现的接口:actionlistener构造方法:public login()主要的成员方法:public void actionperformed(actionevent e) 实现登录和取消按钮的监听器类名:loginstart继承的类:thread主要的方法:public void run()作用:如果登录成功,则弹出客户端聊天窗口,如果登录失败,则打印出登录失败,以告知客户3) 客户端相关的类:类名:client继承的类:jframe实现的接口:actionliste
7、ner构造方法:public client(printstream out,bufferedreader 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(); /服
8、务器用来输入用的文本域private textarea area=new textarea(); /服务器显示消息的文本域private textfield portt=new textfield("8888");private java.awt.list list=new java.awt.list(); /在线客户列表private serversocket server;/服务器private socket client; /客户端private map<string,socket> container=new hashmap<string,sock
9、et>(); /hashmapvoid init()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();panel p10=new panel();/设置两个重要的文本框label lb1=new label("服务器界面");lb1.setbac
10、kground(new color(250,120,150);label lb2=new label("port");borderlayout border1=new borderlayout();p1.setlayout(border1);p1.add(borderlayout.center,area);borderlayout border2=new borderlayout();p5.setlayout(border2);p5.add(borderlayout.north,p3);p5.add(borderlayout.center,msga);borderlayou
11、t border3=new borderlayout();p7.setlayout(border3);p7.add(borderlayout.center,p1);p7.add(borderlayout.south,p5);p7.setbackground(new color(250,150,200);jbutton startbutton=new jbutton("启动服务");jbutton sendbutton=new jbutton("发送");jbutton flushbutton=new jbutton("刷新列表");f
12、lowlayout f1=new flowlayout(flowlayout.left);p8.setlayout(f1);p8.add(lb2);p8.add(portt);p8.add(startbutton);p8.add(sendbutton);p8.add(flushbutton);p8.setbackground(new color(250,120,150);borderlayout border4=new borderlayout();p9.setlayout(border4);p9.add(borderlayout.center,p7);p9.add(borderlayout.
13、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,borderlayout.center);area.seteditable(false);borderlayout border=new borderlayout();this.addwindowlistener(new windowadapter()public
14、void windowclosing(windowevent arg0)system.exit(0););this.setlayout(border);this.add(borderlayout.north,lb1);this.add(borderlayout.center,p9);this.settitle("聊天服务器");this.setbounds(100,100,600,550);this.setvisible(true);/“启动服务”按钮监听器startbutton.addactionlistener(new actionlistener()public vo
15、id actionperformed(actionevent e)thread t=new start();t.start(););/启动服务按钮监听器/发送按钮监听器sendbutton.addactionlistener(new actionlistener()public void actionperformed(actionevent e)string msg =msga.gettext();if(msg!=null&& msg!="")/如果消息不为空calendar ca=new gregoriancalendar();int hh=ca.get
16、(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(""););/end/刷新按钮
17、监听器flushbutton.addactionlistener(new actionlistener()public void actionperformed(actionevent e)if(list!=null)list.removeall(); /清空在线用户列表,以便刷新set<map.entry<string,socket>> myset=container.entryset(); for(iterator<map.entry<string,socket>> it=myset.iterator();it.hasnext();)/刷新列
18、表map.entry<string,socket> me=it.next();string aclientname=me.getkey();socket aclient=me.getvalue();string aclientaddress=aclient.getinetaddress().gethostaddress();list.add(aclientname+"-"+aclientaddress););msga.addkeylistener(new keyadapter()/从键盘监听器-按下enter发送消息public void keypressed(
19、keyevent e)int value=e.getkeycode();if(value=keyevent.vk_enter)string msg=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+"");bro
20、adcast(time +"系统消息:"+msg); /那么广播这条消息area.append(time+"系统消息:"+msg+"n");msga.settext(""););class start extends thread /启动服务器的线程public void run()tryif(server!=null&& !server.isclosed()area.append("警告!服务器已在启动中!n");elseserver=new serversocket(inte
21、ger.parseint(portt.gettext();/启动服务器area.append(new date().tostring()+"n"+"恭喜!(*_*) 嘻嘻"+"服务器启动成功!"+"nn" );while(true)client=server.accept();thread sgs=new sgservice(client); /为每位登录的客户创建一个线程 sgs.start(); /启动客户线程catch(exception e)system.out.println("cuowu 1&
22、quot;);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 string name=null;sgservice(socket client)/构造方法this.client=cl
23、ient;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;container.put(name,client);list.add(name+"-"+client.ge
24、tinetaddress().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(mark<
25、;3)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+"");singlecom(time+"系统消息:警告,请注意文明用语!",client);area.append(time+"系统消息:"+na
26、me+"第"+mark+"次使用了不文明用语,特此警告!");else/如果客户第三次说不文明的话,系统就把他踢出聊天室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+"");if(mark=3)si
27、nglecom(time+"系统消息:"+name+"由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!",client);/告诉他本人removeclient(name,client);/从系统列表中删除这个人的信息/并向所有人广播这一消息broadcast(time+"系统消息:"+name+"由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!n");area.append(time+"系统消息:"+name+"由于多次使用了不文明用语,经警告无效,现已被踢出聊天室!&
28、quot;);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+"说"+msg+"nn");/同时向每个在线客户广播这则消息catch(exc
29、eption 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");li
30、st.remove(name+"-"+client.getinetaddress().gethostaddress();container.remove(name);void removeclient(string name,socket client)list.remove(name+"-"+client.getinetaddress().gethostaddress();container.remove(name);void broadcast(string msg)/broadcast-beginset<map.entry<string
31、,socket>> myset=container.entryset();iterator<map.entry<string,socket>> it=myset.iterator();string message=msg;while(it.hasnext()/如果列表中还有客户map.entry<string,socket> me=it.next();socket tempclient=me.getvalue();singlecom(message,tempclient);/就把消息发给这个客户/向单个客户发送消息private void sin
32、glecom(string msg,socket aclient)/singlecommunition-begintryprintstream pw=new printstream(aclient.getoutputstream();string message=msg;pw.println(msg);catch(exception ex)ex.printstacktrace();public static void main(string args)new server().init();/启动服务器窗口system.out.println("服务器");/聊天室客户端i
33、mport java.awt.event.*;import javax.swing.*;import java.io.*;import .*;import java.awt.*;class client extends jframeprintstream out;/输出流bufferedreader in;/输入流string name;textarea area=new textarea();textarea msga=new textarea();textfield frdnamet=new textfield(10);list list=new list();panel p10=new
34、panel();jbutton sendbutton=new jbutton("发送");jbutton closebutton=new jbutton("关闭");jbutton jb1=new jbutton("设置字体颜色");jbutton jb2=new jbutton("设置背景颜色");label lb1=new label("昵称");void init()this.pack();/设置几个面板panel p1=new panel();panel p2=new panel();p
35、anel 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 border1=new borderlayout();p1.setlayout(border1);p1.add(borderlayout.center,area);area.seteditable(f
36、alse);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(borderlayout.center,msga);p5.setbackground(color.pink);borderlayout broder3=new borderlayout();p7.setlayout(
37、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);borderlayout broder4=new borderlayout();p9.setlayout(broder4);p9.add(borderlayout.center,p7);p9.ad
38、d(borderlayout.south,p8);/窗口关闭this.addwindowlistener(new windowadapter()public void windowclosing(windowevent arg0)system.exit(0););borderlayout broder5=new borderlayout();p10.setlayout(broder5);p10.add(borderlayout.center,list);p10.setbackground(color.blue);/添加字体颜色的监听器jb1.addactionlistener(new acti
39、onlistener()public void actionperformed(actionevent e)jcolorchooser chooser4=new jcolorchooser();color color=chooser4.showdialog(client.this,"我的调色盘",color.yellow);area.setforeground(color);msga.setforeground(color);list.setforeground(color););jb2.addactionlistener(new actionlistener()publi
40、c void actionperformed(actionevent e)jcolorchooser chooser4=new jcolorchooser();color color=chooser4.showdialog(client.this,"我的调色盘",color.yellow);area.setbackground(color););borderlayout border=new borderlayout();this.setlayout(border);this.add(borderlayout.north,lb1);this.add(borderlayout
41、.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 =msga.gettext();msga.settext("");/清空输入文本域out.println(msg
42、););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 actionlistener()/关闭监听器public void actionperf
43、ormed(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 text=null;while(text=in.read
44、line()!=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 java.io.*;import .
45、*;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 panel();panel p5=ne
46、w 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);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度文化产业发展基金担保合同范本3篇
- 个人融资借款利息合同样本版B版
- 专用实验仪器采购合同范本2024版B版
- 高等职业学校办学条件重点监测指标
- 2025年海南鲜品品牌IP授权与开发合同3篇
- 2024年适用最高限额担保合同范本一
- 福建省南平市松溪县郑墩中学2020-2021学年高二数学理月考试题含解析
- 2024年沥青物资采购协议样本版
- 2024年项目借调人员合同集
- 2024年物业服务管理合同标的说明
- ABB断路器参数调试讲义
- 管廊维护与运营绩效考核评分表
- 预应力混凝土简支小箱梁大作业计算书
- 阳宅形法及峦头
- 燃烧机论文定型机加热论文:天然气直燃热风技术在定型机中的应用
- 尾矿库施工组织设计
- 投标文件封标用封面、密封条11
- 300MW火电厂水汽氢电导率超标的原因及处理方法
- 国际文凭组织IBO简介
- 星巴克营销策划方案(共24页)
- 新能源小客车购车充电条件确认书2页
评论
0/150
提交评论