计算机网络期末综合作业报告:基于JSoup+Socket的通信软件

一、实验介绍

本次实验主要使用JSoup和Java自带的Socket通信机制实现一个通信软件。除了聊天功能以外,本次实验的程序还实现了两个附加的功能,一是教务查询,二是个人中心。用户只需要用自己的学号、教务系统密码以及内网VPN密码登录上APP,就会自动加入到一个名为“华北电力大学聊天群”的聊天室中,使用自己的班级姓名作为群内昵称参与聊天,在群内用户可以实时看见在线人数。教务查询功能全部用JSoup实现,包括成绩查询、课表查询等常用的功能。个人中心包含用户的专业、姓名、班级以及退出登录等操作。

二、工具介绍

1.JSoup

JSoup是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。本次实验利用JSoup来模拟登录进而爬取教务系统内的各种信息,获取到的课表以及成绩等信息作为附加功能展示,教务系统中的班级名字作为聊天群内的个人昵称。

2.Socket

在java.net包下有两个类:Socket和ServerSocket,它们继承自java.lang.Object类。Socket用于客户端,ServerSocket用于服务器端。在连接成功时,应用程序两端都会生成相应的Socket对象,操作这个对象,便可完成所需的对话。本次试验利用Java自带的两个类实现了一个简易的聊天室,在聊天室内,用户用自己的班级姓名作为昵称来参与聊天。

三、JSoup爬取教务系统信息

1.需求分析

需要访问教务系统,爬取出各种个人教务信息,并在自己所写的APP上进行展示。由于访问教务系统需要连接校园网,为了方便用户在校外也能使用本APP,所以本次爬取采用了“内网-教务系统”两级爬取策略,即先模拟登录校园内网,然后携带内网cookies登录教务系统,最终爬取相关信息。

2.模拟登录内容

内网登录界面如图1所示:
在这里插入图片描述
主要登录步骤如下:

  1. 在登录界面输入用户名以及登录密码,按下F12,并在Elements中搜索action,查找表单数据最终被提交到哪里,如图2所示:
    在这里插入图片描述
    可以看到,输入的表单数据最终被提交到了"/users/sign_in"里。
  2. 点击登录,在Network里面找到sign_in,可以看到模拟登录需要的各种信息,如图3所示:
    在这里插入图片描述
  3. 写代码模拟登录。

3.模拟登录教务系统

模拟登录进入到了内网界面后,点击教务系统,进入到教务系统的登录界面,利用同样的方式获取模拟登录所需的信息,登录到教务系统中。

四、聊天室的实现

本次实验采用TCPSocket实现聊天通信。服务器端写好后在IntelliJ IDEA上运行,客户端界面在Android Studio上实现。

1.服务器

服务器端需要初始化一个Server对象,端口号指定为10086,本机的IP地址作为服务器的IP地址。服务器端需要做的事情有:
(1)创建ServerSocket对象。
(2)循环调用accept()方法监听客户端的请求,一旦有客户端接入,就将其加入到线程池中。
(3)通过输出流获取客户端发送的信息。
(4)为连接到服务器端的每一个客户端都发送此消息,达到聊天室的功能。
(5)关闭相关资源。

服务器端运行界面如图4所示:
在这里插入图片描述

2.客户端

客户端要实现一个聊天界面,用户登录后自动加入到聊天室,班级姓名将作为自己在群内的昵称。用户可以在聊天界面发送消息,然后此消息将显示在每一个客户端的聊天界面中。用户自己的昵称在消息记录中被标红以做区分。

客户端实现步骤:
(1)用户登录成功后,立刻生成一个socket对象,加入到服务器端的线程池中。
(2)对界面中的消息发送按钮进行点击事件监听,一旦用户点击了发送按钮,就将聊天输入框中的内容发送给服务器端,服务器端再将此消息发送给其线程池中的所有客户端。
(3)持续监听服务器端是否有消息发送过来,有则将其显示在聊天界面上。

五、界面

1.登录界面

登录界面如图5所示:
在这里插入图片描述
用户输入自己的学号、教务系统密码以及内网VPN的密码后,点击Login按钮,即可成功登录。

2.聊天主界面

聊天主界面如图6所示:
在这里插入图片描述
可以看到,当前聊天群里只有用户一个人。用户点击下方的输入框,写好消息之后,点击send按钮,此时的聊天界面如图7所示:
在这里插入图片描述
用户发送的信息显示在了聊天界面上,服务器端记录了这一过程,如图8所示:
在这里插入图片描述
第二个用户在自己的手机上登录成功后,聊天界面如图9所示:
在这里插入图片描述
可以看到,当前群内人数显示为2。当前用户发送消息后,界面显示如图10所示:
在这里插入图片描述

3.查询主界面

客户端查询主界面如图11所示:在这里插入图片描述
在查询界面,利用JSoup爬取到的网页信息设计了多个查询功能。以成绩查询为例,查询结束后的界面如图12所示:
在这里插入图片描述

4.个人中心界面

个人中心界面显示了用户的个人信息,所有信息是通过JSoup爬取教务系统网页获得的,界面如图13所示:
在这里插入图片描述
用户在个人中心可以进行查看个人信息、修改个性签名、退出登录、修改头像等操作。

使用Jsoup获取图片,可以按照以下步骤进行操作: 1. 使用Jsoup.connect()方法连接到指定的URL。 2. 使用Jsoup.parse()方法解析HTML文档。 3. 使用doc.select()方法选择包含图片的元素。 4. 使用element.attr()方法获取图片的URL。 5. 使用Jsoup.connect()方法连接到图片的URL。 6. 使用Response.bodyAsBytes()方法获取图片的字节数组。 下面是一个示例代码,可以获取指定网页中的所有图片: ```java import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.jsoup.Connection.Response; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class ImageDownloader { public static void main(String[] args) throws IOException { String url = "https://www.example.com"; Document doc = Jsoup.connect(url).get(); Elements imgs = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]"); for (Element img : imgs) { String imgUrl = img.attr("abs:src"); Response resultImageResponse = Jsoup.connect(imgUrl) .ignoreContentType(true).execute(); InputStream inputStream = resultImageResponse.bodyStream(); OutputStream outputStream = new FileOutputStream( "image_" + System.currentTimeMillis() + ".jpg"); int bytesRead = -1; byte[] buffer = new byte[4096]; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值