java编写聊天室和爬虫实验报告_第1页
java编写聊天室和爬虫实验报告_第2页
java编写聊天室和爬虫实验报告_第3页
java编写聊天室和爬虫实验报告_第4页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、java编写聊天室和爬虫实验报告 java 语言与网络 课程设计 题目名称:用 javasocket 编程开发聊天室 用 javaurl 编程爬取并分析网页敏感词 姓 名: 学 号: 专 业: 信息安全 班 级: 1602 班 指导教师: 张伟 编写日期: 2021 年 3 月 25 日星期日 目录 第一章 开发工具及环境说明2 第二章 网络聊天程序业务分析3 第三章 网络聊天程序系统设计4 一、 系统功能定义4 二、 关键问题设计4 1.系统模块设计4 2.系统类设计4 第四章 聊天程序源代码清单11 第五章 聊天程序运行结果与测试分析23 第六章 用 javaurl 编程爬取并分析网页敏感

2、词业务分析29 第七章 用 javaurl 编程爬取并分析网页敏感词系统设计30 一、 系统功能定义30 二、 关键问题设计30 1.系统模块设计30 2.系统类设计30 第八章 用 javaurl 编程爬取并分析网页敏感词源代码清单38 第九章 用 javaurl 编程爬取并分析网页敏感词运行结果与测试分析58 第十章 结论与心得62 第一章 开发工具及环境说明 开发工具:intellij idea 环境说明:windows 10 第二章 网络聊天程序业务分析 一、实践目的或任务: 通过指导学生上机实践,对 javasocket 编程、java 多线程、java 图形用户界面进行掌握。 二、

3、实践基本要求: 1.了解实验目的及实验原理; 2.编写程序,并附上程序代码和结果图; 3.总结在编程过程中遇到的问题、解决办法和收获。 三、实践的内容或要求: 1. 用 java 图形用户界面编写聊天室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号。 2. 可以实现群聊(聊天记录显示在所有客户端界面)。 3. 完成好友列表在各个客户端上显示。 4. 可以实现私人聊天,用户可以选择某个其他用户,单独发送信息。 5. 服务器能够群发系统消息,能够强行让某些用户下线。 6. 客户端的上线下线要求能够在其他客户端上面实时刷新。 第三章 网络聊天程序系统设计 一、系统功能定义

4、 本系统要实现的功能如下: 1. 客户端 (1)登录 客户端系统运行,出现登录界面。该界面出现在屏幕中间。用户输入其用户名,然后建立与服务器的连接,输入成功后显示聊天界面。已经登陆了聊天室的用户的聊天记录上面实时刷新上线下线消息,并且同时更新客户端和服务器端的用户列表。 (2)群聊 客户端首先发送消息到服务器端,服务器端转发给全体客户端,所有客户端接收消息并显示在聊天记录中。将消息写入输入框,点击 "发送消息'即可在群内发言。聊天记录显示在所有客户端界面左边,好友列表在各个客户端右边显示。 (3)私聊 客户端首先发送消息到服务器端,服务器端转发给全体客户端,所有客户端接收消息

5、,但是只有特定客户端处理此消息。a 点击右侧好友列表的 b,然后点击"私发消息',即弹出私聊界面,将消息写入输入框,点击 "发消息'即可与另一方私聊。b 的聊天界面显示"系统提示:a 私聊了你',然后点击右侧列表对应好友的用户名,并且点击"发消息'即可查看对方的聊天记录并与对方私聊。 2. 服务器端 (1) 群发系统消息 服务器将消息写入输入框,点击 "群发消息'即可将消息发送给全体客户端,在群内显示系统消息。 (2) 踢用户下线 点击用户列表中对应用户的用户名,然后点击"踢出聊天室'即

6、可关闭对应客户端的套接字,让其在显示"您已被系统请出聊天室!'后关闭会话窗口,强制下线。 二、关键问题设计 1. 系统模块设计 1.1 聊天系统工作原理图 1.2 系统功能模块图: 1.3 活动图: 1)用户登陆活动图 首先填写登陆信息,提交以后登陆成功,更新在线状态。通知所有好友自己已经上线。服务器再检查是否有他的离线消息,如果有则立即发送给用户。 2)发送消息活动图 短消息发送以后,服务器端对应的监听线程会接收到一个字符串。其中包含特殊含义的字符,对应特定的聊天功能。 (1)客户端 上线:login#nickname 下线:offline#nickname#msg 群发消

7、息:msg#nickname#msg 私发消息:第一次:fsmsg#send nickname#receive nicknmame#msg 第一次之后:smsg#send nickname#receive nicknmame#msg (2)服务器端 群发消息:all#msg 踢人:offline#nickname 好友列表:users#nickname 2. 系统类设计 2.1 sever 类的设计 1chatthread:和客户进行消息通信的类。 socket 又称为套接字,是两个程序进行双向数据传输的网络通信的端点,一般由 ip + port 构成。通常采用的端口是大于 1023 的小于

8、65535 的数,1023之前一般被占用,如 80 被 http 服务其占用,21 被 telnet 占用,23 被 ftp 服务器占用等等。socket 是一种底层的通信机制,通过 socket 的数据是原始的字节流,必须经过两端的程序按照协议进行处理和解释。其分为两类,面向连接的tcp/ip 通信,和非连接的 udp 数据报通信,此次实验聊天室是采用 tcp/ip 面向连接编写的。 在服务器端和客户端,分别使用 serversocket 和 socket,基本流程如下: (1)创建套接字 (2)打开连接的 io (3)按照协议读写 (4)关闭资源 服务器用来听,用来等待客户端程序来寻找。如

9、果客户端的程序来寻找 9999端口,那么这个程序就会响应。 服务器通过一个循环一直监听 9999 端口,当有客户端连接到端口时,并把连接的通信添加到服务器管理集合。 大致步骤: (1)创建一个 socket 监听端口 9999。服务器从其连接套接字读取一行字符 (2)通过循环实现一直监听 9999 端口 (3)当有客户端连接到端口时,把连接的客户端传到新的线程将连接的通信添加到服务器管理集合 (4)用 t userlist 定义一个集合,用来存放不同的客户端,可以往客户端里添加个体,并能实现删除 t userlist 中断开连接的线程 (5)循环读取数据,当输入流的数据不为空时,把数据发送到每

10、一个客户端 (6)没有数据后,关闭输入流 重写线程,将 br 作为"听筒'读取全部客户端发送的消息,ps 作为"话筒'向在线的全部客户端发送消息,实现客户端与服务器端的交互。 2.run:接受客户连接请求的类 通过循环监听 9999 端口,当有新用户连接时,把连接的客户端传到新的线程,将连接的通信添加到服务器管理集合,并在聊天室内发送新用户上线的消息。 3. sendmessage:将消息转发给所有客户端 4.handleall:群发系统消息 5.handleexpel:强行让某些用户下线并发布下线消息 2.2 client 类的设计 1. handlese

11、nd():实现群聊 2. handless():实现私聊 3. handlesec():私聊界面 4. run:接受服务器消息的类 5.好友列表在各个客户端上显示,客户端的上线下线要求能够在其他客户端上面实时刷新 defaultlistmodellt;stringgt; dl = new defaultlistmodellt;stringgt;(); private jlistlt;stringgt; userlist = new jlistlt;stringgt;( dl); jscrollpane listpane = new jscrollpane( userlist); listpan

12、e.setpreferredsize(dim2); west.add( listpane,borderlayout. center ); /上线: string msg = br.readline(); string strs = msg.split( quot;#quot;); /判断是否为服务器发来的登陆信息 if(strs0.equals( quot;loginquot;) if(!strs1.equals( nickname) jta.append(strs1 + quot; quot; 上线啦! nquot;); dl.addelement(strs1); userlist.repa

13、int(); /下线: else if(strs0.equals( quot;offlinequot;) dl.removeelement(strs1); userlist.repaint(); 第四章 聊天程序源代码清单 1.sever package chat; import javax.swing.*; import javax.swing.event.listselectionevent; import javax.swing.event.listselectionlistener; import java.awt.*; import java.awt.event.actioneven

14、t; import java.awt.event.actionlistener; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printstream; import .serversocket; import .socket; import java.util.arraylist; class server extends jframe implements runnable, listselectionlistener,

15、actionlistener private socket s = null; private serversocket ss = null; private arraylistlt;chatthreadgt; users = new arraylistlt;chatthreadgt;(); defaultlistmodellt;stringgt; dl = new defaultlistmodellt;stringgt;(); private jlistlt;stringgt; userlist = new jlistlt;stringgt;(dl); private jpanel jpl

16、= new jpanel(); private jbutton jbt = new jbutton(quot;踢出聊天室quot;); private jbutton jbt1 = new jbutton(quot;群发消息quot;); /群发消息输入栏 private jtextfield jtf = new jtextfield(); public server() throws exception this.settitle(quot;服务器端quot;); this.add(userlist, quot;northquot;);/放在北面 this.add(jpl, quot;sou

17、thquot;); /仅将群发消息输入栏设为一栏 jtf.setcolumns(1); jtf.setbackground(color.pink); jpl.setlayout(new borderlayout(); jpl.add(jtf, borderlayout.north); jpl.add(jbt,borderlayout.east);/踢出聊天室 jpl.add(jbt1, borderlayout.west);/群发消息 /实现群发 jbt1.addactionlistener(this); /实现踢人 jbt.addactionlistener(this); this.setd

18、efaultcloseoperation(exit_on_close); this.setlocation(400,100); this.setsize(300, 400); this.setvisible(true); this.setalwaysontop(true); ss = new serversocket(9999); new thread(this).start(); override public void run() while(true) try s = ss.accept(); chatthread ct = new chatthread(s); users.add(ct

19、); /发送 jlist 里的用户登陆信息 listmodellt;stringgt; model = userlist.getmodel(); for(int i = 0; i lt; model.getsize(); i+) ct.ps.println(quot;users#quot; + model.getelementat(i); ct.start(); catch (exception ex) ex.printstacktrace(); javax.swing.joptionpane.showmessagedialog(this,quot;服务器异常!quot;); system.e

20、xit(0); /list 选择事件监听 override public void valuechanged(listselectionevent e) /群发消息按钮点击事件监听 override public void actionperformed(actionevent e) string label = e.getactioncommand(); if(label.equals(quot;群发消息quot;) handleall(); else if(label.equals(quot;踢出聊天室quot;) try handleexpel(); catch (ioexception

21、 e1) e1.printstacktrace(); public void handleall() if(!jtf.gettext().equals(quot;quot;) sendmessage(quot;all#quot; + jtf.gettext(); /发送完后,是输入框中内容为空 jtf.settext(quot;quot;); /群发消息 public void handleexpel() throws ioexception users.get(userlist.getanchorselectionindex().s.close();/关闭套接字 sendmessage(qu

22、ot;offline#quot; + userlist.getselectedvalueslist().get(0); dl.removeelement(userlist.getselectedvalueslist().get(0); userlist.repaint(); /踢人 public class chatthread extends thread socket s = null; private bufferedreader br = null; private printstream ps = null; public boolean canrun = true; string

23、nickname = null; public chatthread(socket s) throws exception this.s = s; br = new bufferedreader(new inputstreamreader(s.getinputstream(); ps = new printstream(s.getoutputstream(); public void run() while(canrun) try string msg = br.readline(); string strs = msg.split(quot;#quot;); if(strs0.equals(

24、quot;loginquot;)/收到来自客户端的上线消息 nickname = strs1; dl.addelement(nickname); sendmessage(msg); else if(strs0.equals(quot;msgquot;) | strs0.equals(quot;smsgquot;) | strs0.equals(quot;fsmsgquot;) sendmessage(msg); else if(strs0.equals(quot;offlinequot;)/收到来自客户端的下线消息 sendmessage(msg); /system.out.println(m

25、sg); dl.removeelement(strs1); / 更新 list 列表 userlist.repaint(); catch (exception ex) public void sendmessage(string msg)/发送给所有用户 for(chatthread ct : users) ct.ps.println(msg); public static void main(string args) throws exception new server(); 2.client package chat; import javax.swing.*; import java.

26、awt.*; import java.awt.event.*; import java.io.bufferedreader; import java.io.inputstreamreader; import java.io.printstream; import .socket; public class client extends jframe implements runnable,actionlistener /north private jmenubar bar = new jmenubar(); private jmenu menu = new jmenu(quot;关于quot;

27、); private jmenuitem about = new jmenuitem(quot;关于本软件quot;); private jmenuitem exit = new jmenuitem(quot;退出quot;); jpanel north = new jpanel(); /west jpanel west = new jpanel(); defaultlistmodellt;stringgt; dl = new defaultlistmodellt;stringgt;(); private jlistlt;stringgt; userlist = new jlistlt;str

28、inggt;(dl); jscrollpane listpane = new jscrollpane(userlist); /center jpanel center = new jpanel(); jtextarea jta = new jtextarea(10,20); jscrollpane js = new jscrollpane(jta); jpanel operpane = new jpanel(); jlabel input = new jlabel(quot;请输入:quot;); jtextfield jtf = new jtextfield(24); jbutton jbu

29、tton = new jbutton(quot;发消息quot;); private jbutton jbt = new jbutton(quot;发送消息quot;); private jbutton jbt1 = new jbutton(quot;私发消息quot;); private bufferedreader br = null; private printstream ps = null; private string nickname = null; jtextarea jtextarea = new jtextarea(); jtextfield jtextfield = ne

30、w jtextfield(); string suser = new string(); boolean flag = false; public cllient() throws exception /north bar.add(menu); menu.add(about); menu.add(exit); about.addactionlistener(this); exit.addactionlistener(this); borderlayout bl = new borderlayout(); north.setlayout(bl); north.add(bar,borderlayo

31、ut.north); add(north,borderlayout.north); /west dimension dim = new dimension(100,150); west.setpreferredsize(dim); dimension dim2 = new dimension(100,300); listpane.setpreferredsize(dim2); borderlayout bl2 = new borderlayout(); west.setlayout(bl2); west.add(listpane,borderlayout.center);/显示好友列表哈哈 a

32、dd(west,borderlayout.east); userlist.setfont(new font(quot;隶书quot;,font.bold,18); /center jta.seteditable(false); jtf.setbackground(color.pink); borderlayout bl3 = new borderlayout(); center.setlayout(bl3); flowlayout fl = new flowlayout(flowlayout.left); operpane.setlayout(fl); operpane.add(input);

33、 operpane.add(jtf); operpane.add(jbt, borderlayout.west); operpane.add(jbt1, borderlayout.east); center.add(js,borderlayout.center); center.add(operpane,borderlayout.south); add(center,borderlayout.center); js.setverticalscrollbarpolicy(jscrollpane.vertical_scrollbar_as_needed); /鼠标事件,点击 jbt.addacti

34、onlistener(this); jbt1.addactionlistener(this); this.setdefaultcloseoperation(exit_on_close); /this.setalwaysontop(true); nickname = joptionpane.showinputdialog(quot;用户名:quot;); this.settitle(nickname + quot;的聊天室quot;); this.setsize(600,400); this.setvisible(true); socket s = new socket(quot;127.0.0

35、.1quot;, 9999); br = new bufferedreader(new inputstreamreader(s.getinputstream(); ps = new printstream(s.getoutputstream(); new thread(this).start(); ps.println(quot;login#quot; + nickname); /键盘事件,实现当输完要发送的内容后,直接按回车键,实现发送 /监听键盘相应的控件必须是获得焦点(focus)的情况下才能起作用 jtf.addkeylistener(new keyadapter() override

36、 public void keypressed(keyevent e) if(e.getkeycode() = keyevent.vk_enter) ps.println(quot;msg#quot; + nickname + quot;#quot; + jtf.gettext(); /发送完后,是输入框中内容为空 jtf.settext(quot;quot;); ); jtf.setfocusable(true); /监听系统关闭事件,退出时给服务器端发出指定消息 this.addwindowlistener(new windowadapter() override public void

37、windowclosing(windowevent e) ps.println(quot;offline#quot; + nickname); ); public void run() while (true) try string msg = br.readline(); string strs = msg.split(quot;#quot;); /判断是否为服务器发来的登陆信息 if(strs0.equals(quot;loginquot;) if(!strs1.equals(nickname) jta.append(strs1 + quot;上线啦!nquot;); dl.addelem

38、ent(strs1); userlist.repaint(); else if(strs0.equals(quot;msgquot;) if(!strs1.equals(nickname) jta.append(strs1 + quot;说:quot; + strs2 + quot;nquot;); else jta.append(quot;我说:quot; + strs2 + quot;nquot;); else if(strs0.equals(quot;usersquot;) dl.addelement(strs1); userlist.repaint(); else if(strs0.e

39、quals(quot;allquot;) jta.append(quot;系统消息:quot; + strs1 + quot;nquot;); else if(strs0.equals(quot;offlinequot;) jta.append(strs1 + quot;下线啦!nquot;); dl.removeelement(strs1); userlist.repaint(); else if(strs2.equals(nickname) | strs1.equals(nickname) amp;amp; strs0.equals(quot;smsgquot;) if(!strs1.eq

40、uals(nickname) jtextarea.append(strs1 + quot;说:quot; + strs3 + quot;nquot;); else jtextarea.append(quot;我说:quot; + strs3 + quot;nquot;); else if(strs2.equals(nickname) | strs1.equals(nickname)amp;amp; strs0.equals(quot;fsmsgquot;)/只有发信人和私信人能看(第一次) if(strs2.equals(nickname)/如果被私信人是自己则显示系统消息 jtextarea

41、.append(strs1 + quot;说:quot; + strs3 + quot;nquot;); jta.append(quot;系统提示:quot; + strs1 + quot;私信了你quot; + quot;nquot;); else/若自己为发信人 jtextarea.append( quot;我说:quot; + strs3 + quot;nquot;); catch (exception ex) ex.printstacktrace(); javax.swing.joptionpane.showmessagedialog(this, quot;您已被系统请出聊天室!quo

42、t;); ps.println(quot;offline#quot; + nickname); system.exit(0); override public void actionperformed(actionevent e) string label = e.getactioncommand(); if(label.equals(quot;发送消息quot;)/群发 handlesend(); else if(label.equals(quot;私发消息quot;) amp;amp; !userlist.isselectionempty()/未点击用户不执行 suser = userli

43、st.getselectedvalueslist().get(0); handlesec(); else if(label.equals(quot;发消息quot;) handless(); else if(label.equals(quot;关于本软件quot;) joptionpane.showmessagedialog(this, quot;世界上最可爱的人制作quot;); else if(label.equals(quot;退出quot;) joptionpane.showmessagedialog(this, quot;您已成功退出!quot;); ps.println(quot;

44、offline#quot; + nickname); system.exit(0); else system.out.println(quot;不识别的事件quot;); public void handless() if(flag) ps.println(quot;smsg#quot; + nickname + quot;#quot; + suser + quot;#quot; + jtextfield.gettext(); jtextfield.settext(quot;quot;); else/首次私信格式为quot;fsmsg# 发信人 # 收信人 # 内容 ps.println(qu

45、ot;fsmsg#quot; + nickname + quot;#quot; + suser + quot;#quot; + jtextfield.gettext(); jtextfield.settext(quot;quot;); flag = true; /私聊中 public void handlesend() /发送信息时标识一下来源 ps.println(quot;msg#quot; + nickname + quot;#quot; + jtf.gettext(); /发送完后,是输入框中内容为空 jtf.settext(quot;quot;); /群聊 public void h

46、andlesec() jframe jframe = new jframe(); jframe.add(jbutton, borderlayout.south); jframe.add(jtextfield, borderlayout.north); jframe.add(jtextarea,borderlayout.center); jbutton.addactionlistener(this); jtextarea.setfont(new font(quot;宋体quot;, font.plain,15); jtextfield.setbackground(color.pink); jfr

47、ame.setsize(400,300); jframe.setlocation(400,150); jframe.settitle(quot;与quot; + userlist.getselectedvalueslist().get(0) + quot;私聊中quot;); jframe.setvisible(true); jframe.addwindowlistener(new windowlistener() override public void windowopened(windowevent e) public void windowclosing(windowevent e)

48、flag = false; /joptionpane.showmessagedialog(this, quot;您已成功退出!quot;); override public void windowclosed(windowevent e) override public void windowiconified(windowevent e) override public void windowdeiconified(windowevent e) override public void windowactivated(windowevent e) override public void w

49、indowdeactivated(windowevent e) ); /私聊窗口 public static void main(string args)throws exception new client(); 第五章 聊天程序运行结果与测试分析 1. 服务器界面 首先运行服务器界面,界面如图。 服务器运行后,客户可以登录聊天室。服务器显示在线用户列表,客户注册时,能够将用户名存在服务器端。服务器将消息写入输入框,点击 "群发消息'即可将消息发送给全体客户端,在群内显示系统消息。点击用户列表中对应用户的用户名,然后点击"踢出聊天室'即可关闭对应客户端的套

50、接字,让其在显示"您已被系统请出聊天室!'后关闭会话窗口,强制下线。 2. 登录界面 客户端系统运行,出现登录界面,如图。 该界面出现在屏幕中间,在这个界面中: 输入用户名,并点击"确定'按钮,能够连接到服务器,能够到达聊天界面。 3.聊天界面 客户登录成功之后,出现聊天界面,如图。 在这个界面中: a) 标题栏显示当前登陆的账号。 b) 左边显示聊天记录,右边显示在线用户.。 c) 客户可以进行群聊,也可以选择一个在线账号,与其进行私聊。 (1)实现群聊 (2)刷新好友列表 (3)私聊 (4)服务器群发消息 (5)实现踢人 第六章 用 javaurl 编程爬取并分析网页敏感词业务分析 一、实践目的或任务: 通过指导学生上机实践,对 javaurl 编程、java 图形界面进行掌握。 二、实践基本要求: 1.了解实验目的及实验原理; 2.编写程序,并附上程序代码和结果图; 3.总结在编程过程中遇到的问题、解决办法和收获。 三、实践的内容或要求: 1.编写界面,输入一个网址,能够爬取该网址上所有的 html 源代码。 2.对网址中的文本进行提取。 3.建立敏感词库,用文本文件保存。 4.将该网址所对应的文本中的敏感词提

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论