大家好,我是雨宣,时隔多日,又和大家见面了。近期又很多人私信我,大多数都是刚学完JAVASE的小白或者是想回顾JAVASE阶段的白小白,苦于找不到合适的练习题,很多教程后面会有少量的练习题,但是综合度不高,针对性一般,大多数人做完了我之前写的一个JAVASE项目综合演练后,觉得还是不够,还想来个在有难度的练习题。

这段时间忙中抽闲,结合企业中实际的业务场景以及JAVASE自身的知识点,给大家带来了一个基于网络,IO以及其他基础知识点的综合练习项目。这个项目主要考察大家对IO流,InputStream,OutputStream,Socket,ServerSocket的掌握。

俗话说不同的厨师相同的食材能够做出不同的美味,本项目主要结合网络和IO流来给大家带来不一样的项目体验。

项目背景简介

相信大家都下载过文件,从网上下载一个图片,视频什么的,有的从浏览器进行下载,有的可能会安装迅雷,IDM之类的下载工具,那么我们在下载的同时有没有想过其中的原理什么?为什么我们一点下载按钮会有文件下载下来?其数据的形式是以什么传输的?为什么会有限速?限速其背后的是如何实现的?什么是断点续传?什么是分段上传?什么是合并?以上提出了几个问题,如果大家学完后能答出以上几个问题的百分之八十,那就说明掌握的还差不多。

项目方案(本次项目主要的方案)

方案一:

方案一就类似于微信,比如说你发一个文件给别人,别人收到,做法是 你先发送一个文件到微信的服务器,文件成功上传到服务器后,在通知别人,别人收到通知后在去微信的服务器下载该文件,该方案又有主动模式和被动模式(相对于服务器而言):

主动模式流程图如下:

java 限速方案_Java综合练习题

被动模式流程图如下:

java 限速方案_Java练习题_02

 

方案二:

方案二是对端传输,比如现在有两台电脑A和B,A要给B发文件,直接发给B,不用经过任何中转。流程图如下:

java 限速方案_java 限速方案_03

方案三:

方案三是在方案二的基础上优化而来的,比如现在有两台电脑A和B,A要给B发文件,这个时候有一个中央服务器C,A和B在局域网内,C可能不在同一个局域网,A发文件给B,步骤如下:

1、A先发给C,询问C是否有B的地址(IP地址)

2、C:如果有,直接返回B的IP,A和B发送建立对端链接,如果没有,A发送给C,B在从C取,相当于走的是第一种方案。

流程如如下:

java 限速方案_Java综合练习题_04

 

题目要求

要求自主实现3套方案(不是任选其一哦),在能力允许的情况下三种方案都实现一遍,尤其是第三种,如果第三种能自己实现出来,对IO和网络这块的理解将会有更深一个层次的理解。

涉及到的类如下:

//传输对象
public class TrsFile {

   private String fileName; //文件名称
   private String fileType; //文件类型
   private Long fileSize; //大小
   private String srcIP; //来源IP
   private String srcMAC; //来源MAC地址
   private String dstIP; //目标IP
   private String dstMAC; //目标MAC地址
   private byte[] data; //传输内容

}

/**

 1、为了适当的增加难度,故增加了目标的IP 和 目标的MAC地址,就是发送给对方电脑的IP和MAC地址,对方电脑在收到的时候需要判断是不是给我发的。
 2、难点:在发送的时候如何获取到对方的MAC地址

*/

1、要求使用单个Class类来完成,如果有多个类,采用内部类的形式。

2、项目做完后,要求使用 java xxx 可以直接启动,非在编辑器中运行。

3、在做项目过程中进行必要合法性判断。

4、采用命令行的形式来发送:比如

java xxx 192.168.3.112:8080 D:/xxx.jpg

//拆解
java 命令
xxx 编译后的class文件
192.168.3.112:8080  要发送给目标电脑的IP
D:/xxx.jpg  要发送的文件

//如果采用方案一
192.168.3.112:8080  为server的地址

//如果采用方案二
192.168.3.112:8080  为目标电脑的地址

//如果采用方案三
192.168.3.112:8080  为server的地址,server收到后返回 
已经链接的所有客户端的地址,需要把所有的地址打印在CMD窗口中,比如:
1、192.168.3.110:8080
2、192.168.3.111:8080
3、192.168.3.112:8080
4、192.168.3.113:8080
...
如果输入 3,程序拿到后直接向 192.168.3.112:8080 传输,
走方案二。如果输入3,目标端口无法链接,则直接向server端发送,
走方案一。如果server端没有任何返回,直接向server端发送,走方案一。


//注意
在拿到列表选择IP的时候需要判断目标端口是否可以发送,如果不行目标IP无法连上,则向server发送,如果server也断开,直接返回。

拓展练习

以下根据能力情况来决定要不要扩展哦

1、发送和接收双方需要密钥,发送端要发送文件给接收端的时候需要拿到接收端的密钥进行发送,提高安全性。

2、服务器地址可以配置成默认的,java xxx 192.168.3.112:8080 D:/xxx.jpg 其中的 192.168.3.112:8080为接收端地址。

3、在程序启动的时候可以提供三个选项来选择,要启动方案几来发送。用户输入几,就开始方案几的传输。

4、大文件断点续传,分段上传,比如传输一个10GB的文件,采用多线程分段上传,按照序号在接收端进行合并。分段上传合并我之前写过一篇文章可以参考。