《java编写聊天室和爬虫实验报告.docx》由会员分享,可在线阅读,更多相关《java编写聊天室和爬虫实验报告.docx(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java编写聊天室和爬虫实验报告 Java 语言与网络 课程设计 题目名称:用 JavaSocket 编程开发闲聊室 用 JavaURL 编程爬取并分析网页敏感词 姓名:学号: 专业:信息平安 班级: 1602 班 指导老师:张伟 编写日期:2022 年 3 月 25 日星期日书目第一章 开发工具及环境说明…………………………………2 其次章 网络闲聊程序业务分析………&h
2、ellip;……………………3 第三章 网络闲聊程序系统设计………………………………4 一、 系统功能定义…………………………………&he
3、llip;……4 二、 关键问题设计…………………………………………4 1.系统模块设计………………………………………4 2.系统类设计&
4、hellip;………………………………………4 第四章 闲聊程序源代码清单…………………………………11 第五章 闲聊程序运行结果与测试分析…………&h
5、ellip;…………23 第六章 用 JavaURL 编程爬取并分析网页敏感词业务分析…29 第七章 用 JavaURL 编程爬取并分析网页敏感词系统设计…30 一、 系统功能定义…………………………………………30 二、 关键问题设计………&hel
6、lip;………………………………30 1.系统模块设计………………………………………30 2.系统类设计…………………&he
7、llip;……………………30 第八章 用 JavaURL 编程爬取并分析网页敏感词源代码清单…38 第九章 用 JavaURL 编程爬取并分析网页敏感词运行结果与测试分析………………………………………………&hellip
8、;…………58 第十章 结论与心得……………………………………………62第一章 开发工具及环境说明 开发工具:Intellij IDEA环境说明:Windows 10其次章 网络闲聊程序业务分析 一、实践目的或任务:通过指导学生上机实践,对 JavaSocket 编程、Java 多线程、Java 图形用户
9、界面进行驾驭。二、实践基本要求:1.了解试验目的及试验原理; 2.编写程序,并附上程序代码和结果图; 3.总结在编程过程中遇到的问题、解决方法和收获。三、实践的内容或要求:1. 用 Java 图形用户界面编写闲聊室服务器端和客户端, 支持多个客户端连接到一个服务器。每个客户端能够输入账号。2. 可以实现群聊(闲聊记录显示在全部客户端界面)。3. 完成好友列表在各个客户端上显示。4. 可以实现私人闲聊,用户可以选择某个其他用户,单独发送信息。5. 服务器能够群发系统消息,能够强行让某些用户下线。6. 客户端的上线下线要求能够在其他客户端上面实时刷新。第三章 网络闲聊程序系统设计 一、系统功能定义
10、 本系统要实现的功能如下:1. 客户端(1)登录 客户端系统运行,出现登录界面。该界面出现在屏幕中间。用户输入其用户名,然后建立与服务器的连接,输入胜利后显示闲聊界面。已经登陆了闲聊室的用户的闲聊记录上面实时刷新上线下线消息,并且同时更新客户端和服务器端的用户列表。(2)群聊 客户端首先发送消息到服务器端,服务器端转发给全体客户端,全部客户端接收消息并显示在闲聊记录中。将消息写入输入框,点击 发送消息即可在群内发言。闲聊记录显示在全部客户端界面左边,好友列表在各个客户端右边显示。(3)私聊 客户端首先发送消息到服务器端,服务器端转发给全体客户端,全部客户端接收消息,但是只有特定客户端处理此消息
11、。A 点击右侧好友列表的 B,然后点击私发消息,即弹出私聊界面,将消息写入输入框,点击 发消息即可与另一方私聊。B 的闲聊界面显示系统提示:A 私聊了你,然后点击右侧列表对应好友的用户名,并且点击发消息即可查看对方的闲聊记录并与对方私聊。2. 服务器端(1)群发系统消息 服务器将消息写入输入框,点击 群发消息即可将消息发送给全体客户端,在群内显示系统消息。(2)踢用户下线 点击用户列表中对应用户的用户名,然后点击踢出闲聊室即可关闭对应客户端的套接字,让其在显示您已被系统请出闲聊室!后关闭会话窗口,强制下线。二、关键问题设计 1.系统模块设计1.1 闲聊系统工作原理图1.2系统功能模块图:1.3
12、 活动图:1)用户登陆活动图 首先填写登陆信息,提交以后登陆胜利,更新在线状态。通知全部好友自己已经上线。服务器再检查是否有他的离线消息,假如有则马上发送给用户。 2)发送消息活动图 短消息发送以后,服务器端对应的监听线程会接收到一个字符串。其中包含特别含义的字符,对应特定的闲聊功能。(1)客户端 上线:LOGIN#nickname 下线:OFFLINE#nickname#msg 群发消息:MSG#nickname#msg 私发消息:第一次:FSMSG#send nickname#receive nicknmame#msg 第一次之后:SMSG#send nickname#receive ni
13、cknmame#msg (2)服务器端 群发消息:ALL#msg踢人:OFFLINE#nickname 好友列表:USERS#nickname2.系统类设计2.1 sever 类的设计1ChatThread:和客户进行消息通信的类。Socket 又称为套接字,是两个程序进行双向数据传输的网络通信的端点,一般由 IP + PORT 构成。通常采纳的端口是大于 1023 的小于 65535 的数,1023之前一般被占用,如 80 被 HTTP 服务其占用,21 被 Telnet 占用,23 被 FTP 服务器占用等等。Socket 是一种底层的通信机制,通过 Socket 的数据是原始的字节流,必
14、需经过两端的程序根据协议进行处理和说明。其分为两类,面对连接的TCP/IP 通信,和非连接的 UDP 数据报通信,此次试验闲聊室是采纳 TCP/IP 面对连接编写的。在服务器端和客户端,分别运用 ServerSocket 和 Socket,基本流程如下:(1)创建套接字 (2)打开连接的 IO (3)根据协议读写 (4)关闭资源服务器用来听,用来等待客户端程序来找寻。假如客户端的程序来找寻 9999端口,那么这个程序就会响应。服务器通过一个循环始终监听 9999 端口,当有客户端连接到端口时,并把连接的通信添加到服务器管理集合。大致步骤:(1)创建一个 socket 监听端口 9999。服务器
15、从其连接套接字读取一行字符 (2)通过循环实现始终监听 9999 端口 (3)当有客户端连接到端口时,把连接的客户端传到新的线程将连接的通信添加到服务器管理集合 (4)用 t userList 定义一个集合,用来存放不同的客户端,可以往客户端里添加个体,并能实现删除 t userList 中断开连接的线程 (5)循环读取数据,当输入流的数据不为空时,把数据发送到每一个客户端 (6)没有数据后,关闭输入流 重写线程,将 br 作为听筒读取全部客户端发送的消息,ps 作为话筒向在线的全部客户端发送消息,实现客户端与服务器端的交互。 2.run:接受客户连接恳求的类 通过循环监听 9999 端口,当
16、有新用户连接时,把连接的客户端传到新的线程,将连接的通信添加到服务器管理集合,并在闲聊室内发送新用户上线的消息。3.sendMessage:将消息转发给全部客户端4.handleAll:群发系统消息5.handleExpel:强行让某些用户下线并发布下线消息2.2 client 类的设计 1. handleSend():实现群聊2. handleSS():实现私聊3. handleSec():私聊界面4. run:接受服务器消息的类5.好友列表在各个客户端上显示,客户端的上线下线要求能够在其他客户端上面实时刷新 DefaultListModel<String> dl
17、 = new DefaultListModel<String>(); private JList<String> userList = new JList<String>( dl); JScrollPane listPane = new JScrollPane( userList); listPane.setPreferredSize(dim2); west.add( listPane,BorderLayout. CENTER ); /上线:String msg = br.readLine(); String
18、strs = msg.split( "#"); /推断是否为服务器发来的登陆信息 if(strs0.equals( "LOGIN")if(!strs1.equals( nickName) jta.append(strs1 + " " 上线啦! n"); dl.addElement(strs1); userList.repaint(); /下线:else if(strs0.equals( "OFFLINE") dl.removeElem
19、ent(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.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedRead
20、er; 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, ActionListener private Socket s = null; private ServerSocket ss = nu
21、ll; private ArrayList<ChatThread> users = new ArrayList<ChatThread>(); DefaultListModel<String> dl = new DefaultListModel<String>(); private JList<String> userList = new JList<String>(dl);private JPanel jpl = new JPa
22、nel(); private JButton jbt = new JButton("踢出闲聊室"); private JButton jbt1 = new JButton("群发消息"); /群发消息输入栏 private JTextField jtf = new JTextField(); public server() throws Exception this.setTitle("服务器端"); this.add(userList, "North"
23、;);/放在北面 this.add(jpl, "South");/仅将群发消息输入栏设为一栏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); /实现踢人 j
24、bt.addActionListener(this); this.setDefaultCloseOperation(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
25、 ct = new ChatThread(s); users.add(ct); /发送 Jlist 里的用户登陆信息 ListModel<String> model = userList.getModel(); for(int i = 0; i < model.getSize(); i+) ct.ps.println("USERS#" + model.getElementAt(i); ct.start(); catch (Exception ex) ex.printStackTrace(); javax.swing.
26、JOptionPane.showMessageDialog(this,"服务器异样!"); System.exit(0); /List 选择事务监听 Override public void valueChanged(ListSelectionEvent e) /群发消息按钮点击事务监听 Override public void actionPerformed(ActionEvent e) String label = e.getActionCommand(); if(label.equals("群发消息") handle
27、All(); else if(label.equals("踢出闲聊室") try handleExpel(); catch (IOException e1) e1.printStackTrace(); public void handleAll() if(!jtf.getText().equals("") sendMessage("ALL#" + jtf.getText(); /发送完后,是输入框中内容为空 jtf.setText(""); /群发消息
28、public void handleExpel() throws IOException users.get(userList.getAnchorSelectionIndex().s.close();/关闭套接字sendMessage("OFFLINE#" + userList.getSelectedValuesList().get(0); dl.removeElement(userList.getSelectedValuesList().get(0); userList.repaint();/踢人public class ChatThread extend
29、s Thread Socket s = null; private BufferedReader br = null; private PrintStream ps = null; public boolean canRun = true; String nickName = null; public ChatThread(Socket s) throws Exception this.s = s; br = new BufferedReader(new InputStreamReader(s.getInputStream(); ps = new PrintStream(s.getOutput
30、Stream(); public void run() while(canRun) try String msg = br.readLine(); String strs = msg.split("#"); if(strs0.equals("LOGIN")/收到来自客户端的上线消息 nickName = strs1; dl.addElement(nickName); sendMessage(msg); else if(strs0.equals("MSG") | strs0.equals(
31、"SMSG") | strs0.equals("FSMSG") sendMessage(msg); else if(strs0.equals("OFFLINE")/收到来自客户端的下线消息 sendMessage(msg); /System.out.println(msg); dl.removeElement(strs1); / 更新 List 列表 userList.repaint(); catch (Exception ex) public void sendMessage(Stri
32、ng 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.awt.*; import java.awt.event.*; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.Pr
33、intStream; import .Socket;public class client extends JFrame implements Runnable,ActionListener /north private JMenuBar bar = new JMenuBar(); private JMenu menu = new JMenu("关于"); private JMenuItem about = new JMenuItem("关于本软件"); private JMenuItem exit = new JMenu
34、Item("退出"); JPanel north = new JPanel(); /west JPanel west = new JPanel(); DefaultListModel<String> dl = new DefaultListModel<String>(); private JList<String> userList = new JList<String>(dl); JScrollPane listPane = new JScrol
35、lPane(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("请输入:"); JTextField jtf = new JTextField(24); JButton jButton = new JButton("发消息&am
36、p;quot;); private JButton jbt = new JButton("发送消息"); private JButton jbt1 = new JButton("私发消息"); private BufferedReader br = null; private PrintStream ps = null; private String nickName = null;JTextArea jTextArea = new JTextArea(); JTextField jTextField = new JTex
37、tField(); 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,BorderLayout.NORT
38、H); 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);/显示好友列表哈哈 add(west
39、,BorderLayout.EAST); userList.setFont(new Font("隶书",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)
40、; 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.addActio
41、nListener(this); jbt1.addActionListener(this); this.setDefaultCloseOperation(EXIT_ON_CLOSE); /this.setAlwaysOnTop(true);nickName = JOptionPane.showInputDialog("用户名:"); this.setTitle(nickName + "的闲聊室"); this.setSize(600,400); this.setVisible(true);Socket s = new So
42、cket("127.0.0.1", 9999); br = new BufferedReader(new InputStreamReader(s.getInputStream(); ps = new PrintStream(s.getOutputStream(); new Thread(this).start(); ps.println("LOGIN#" + nickName);/键盘事务,实现当输完要发送的内容后,干脆按回车键,实现发送 /监听键盘相应的控件必需是获得焦点(focus)的状况下才能起作用jtf.addKe
43、yListener(new KeyAdapter() Override public void keyPressed(KeyEvent e) if(e.getKeyCode() = KeyEvent.VK_ENTER) ps.println("MSG#" + nickName + "#" +jtf.getText(); /发送完后,是输入框中内容为空 jtf.setText(""); );jtf.setFocusable(true);/监听系统关闭事务,退出时给服务器端发出指定消息 th
44、is.addWindowListener(new WindowAdapter() Override public void windowClosing(WindowEvent e) ps.println("OFFLINE#" + nickName); ); public void run() while (true) try String msg = br.readLine(); String strs = msg.split("#"); /推断是否为服务器发来的登陆信息 if(strs0.equals("
45、;LOGIN") if(!strs1.equals(nickName) jta.append(strs1 + "上线啦!n"); dl.addElement(strs1); userList.repaint(); else if(strs0.equals("MSG") if(!strs1.equals(nickName) jta.append(strs1 + "说:" + strs2 + "n"); else jta.append("我说:" + strs2 + "n"); else if(strs0.equals("USERS") dl.addElement(strs1); userList.repaint(); else if(strs0.equals("ALL") jta.appe