文件传输和秒传
InetAddress类:
InetAddress类是IP地址的封装类,就是把设定的某个ip封装成InetAddress对象,然后使用这个对象能够进行相关的操作。例如获取域名或主机名、上网ip等等。这个类不能直接new,需要通过方法来获得对象,不同的方法可以得到不同的InetAddress对象。
代码示例:
运行结果:
得到不同的InetAddress对象,能够进行不同的操作,使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。使用IP地址创建InetAddress对象(getByName,getAllByNamegetByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。
代码示例:
运行结果:
获得某个主机名的全部信息:
运行结果:
封装某个ip地址:
运行结果:
ServerSocket类的构造器:
ServerSocket类有几个构造器,这些构造器可以定义一些设置,例如限制同时连接次数、限制IP地址连接等等,如果要限制连接的IP则需要使用刚才的InetAddress类的对象,需要把允许连接的IP封装InetAddress对象,才能通过构造器的参数传递。
ServerSocket类的构造器:
代码示例:
文件传输:
服务器向客户端传输文件叫下载,客户端向服务器传输文件叫上传。我们可以使用ServerSocket和Socket编写服务端和客户端进行文件的传输。
实际上文件传输很简单,就像文件复制一样,只不过通过的流是网络流。客户端先用FileInputStream流读取文件,然后通过OutputStream传输到服务端,服务端则用InputStream接收文件数据的同时,通过FileOutputStream传输到本地上。
服务端代码示例:
客户端代码示例:
运行结果:
秒传:
秒传的原理实际上,是利用MD5加密文件,因为只要是文件内容一样的,加密出来的MD5密匙就是一样的。所以利用这一特性,客户端上传文件时会先将文件加密成MD5,然后服务端只需要对比一下服务端上的MD5就可以知道是否有这个文件了,如果有这个文件就不需要上传了,就达到“秒传”的效果。像网盘的原理也是这样的,服务器端不会有重复的文件,每个客户端下载、存储的其实都是同一个文件。
如果需要编写一个这种秒传机制的客户端和服务端,需要一个MD5加密类,一般在百度就能下载到,然后把这个类复制到工程目录下以备使用。
MD5加密类代码:
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5FileUtil {
protected static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e','f' };
protected static MessageDigest messagedigest = null;
static {
try {
messagedigest = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
}
}
public static String getFileMD5String(File file) throws IOException {
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
messagedigest.update(byteBuffer);
return bufferToHex(messagedigest.digest());
}
public static String getMD5String(String s) {
return getMD5String(s.getBytes());
}
public static String getMD5String(byte[] bytes) {
messagedigest.update(bytes);
return bufferToHex(messagedigest.digest());
}
private static String bufferToHex(byte bytes[]) {
return bufferToHex(bytes, 0, bytes.length);
}
private static String bufferToHex(byte bytes[], int m, int n) {
StringBuffer stringbuffer = new StringBuffer(2 * n);
int k = m + n;
for (int l = m; l < k; l++) {
appendHexPair(bytes[l], stringbuffer);
}
return stringbuffer.toString();
}
private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
char c0 = hexDigits[(bt & 0xf0) >> 4];
char c1 = hexDigits[bt & 0xf];
stringbuffer.append(c0);
stringbuffer.append(c1);
}
public static boolean checkPassword(String password, String md5PwdStr) {
String s = getMD5String(password);
return s.equals(md5PwdStr);
}
}
客户端代码示例:
服务端代码示例:
运行结果:
- QTableView表格视图的列宽设置
- OpenProcess打开进程返回错误的问题
- Python标准库01 正则表达式 (re包)
- 剑指OFFER之栈的压入、弹出序列(九度OJ1366)
- Python标准库03 路径与文件 (os.path包, glob包)
- AI人工智能时代已经到来 “北斗即时判”实现纯语音交互
- 剑指OFFER之链表中倒数第k个节点(九度OJ1517)
- 用Qt写软件系列四:定制个性化系统托盘菜单
- Linux简介与厂商版本
- 用Qt写软件系列三:一个简单的系统工具之界面美化
- VS编译链接时错误(Error Link2005)的解决方法
- HttpClient使用心得
- 剑指OFFER之重建二叉树(九度OJ1385)
- 记录visual Studio使用过程中的两个问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 手把手教你实现自定义Spring Boot的 Starter
- JVM详解之:本地变量的生命周期
- VBA解析复合文档01——实现的功能
- VBA解压缩ZIP文件09——解压-静态Huffman
- 第5章 流水线数据脱敏-Jenkins系统凭据管理
- 100% 展示 MySQL 语句执行的神器-Optimizer Trace
- Kafka消费者分区分配策略及自定义分配策略
- Java8新特性之日期、时间操作
- Java8新特性之Stream流(基础篇)
- Effective Java(一)
- Effective Java(二)
- Effective Java(三)
- Log4j 入门教程
- Map 和 Map 比较
- Java8新特性之Optional类