文件传输和秒传

InetAddress类是IP地址的封装类,就是把设定的某个ip封装成InetAddress对象,然后使用这个对象能够进行相关的操作。例如获取域名或主机名、上网ip等等。这个类不能直接new,需要通过方法来获得对象,不同的方法可以得到不同的InetAddress对象。

代码示例:

92372263e4561962006f99ca79fc9290.png


运行结果:

883b1ba28485fc88b5dac685241004cf.png



得到不同的InetAddress对象,能够进行不同的操作,使用IP地址创建InetAddress对象(getByName,getAllByName,getByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。使用IP地址创建InetAddress对象(getByName,getAllByNamegetByAddress方法都可以通过IP地址创建InetAddress对象)时,并不需要访问DNS服务器。因此,通过DNS服务器查找域名的工作就由getHostName方法来完成。

 

代码示例:

8d176b8e08e4b1325437ebb09b8f49c0.png


运行结果:

7a544f3ac913679103ace17e70dbebd9.png


获得某个主机名的全部信息:

e512801cf180842a13d3225dd9e896cc.png


运行结果:

34f724b29d943be2ba9668fdfc37a753.png


封装某个ip地址:

c9575aa1ded8277785829b067084b7c5.png


运行结果:

d3848093079d94a4046b638fec971b66.png



ServerSocket类的构造器:

ServerSocket类有几个构造器,这些构造器可以定义一些设置,例如限制同时连接次数、限制IP地址连接等等,如果要限制连接的IP则需要使用刚才的InetAddress类的对象,需要把允许连接的IP封装InetAddress对象,才能通过构造器的参数传递。

  ServerSocket类的构造器:

39d8d8f327a21e2b174c2317210bb27a.png


代码示例:

6b257fe102b1f4eb6db274d38282fdad.png



文件传输:

服务器向客户端传输文件叫下载,客户端向服务器传输文件叫上传。我们可以使用ServerSocketSocket编写服务端和客户端进行文件的传输。

实际上文件传输很简单,就像文件复制一样,只不过通过的流是网络流。客户端先用FileInputStream流读取文件,然后通过OutputStream传输到服务端,服务端则用InputStream接收文件数据的同时,通过FileOutputStream传输到本地上。

  服务端代码示例:

72592bdabafdb61cfc4169695c289239.png



客户端代码示例:

9796fcf598500d6ade87aa9a55fcd76f.png


运行结果:

81eb5bd543649a7605ce643181df5d46.png



秒传:

秒传的原理实际上,是利用MD5加密文件,因为只要是文件内容一样的,加密出来的MD5密匙就是一样的。所以利用这一特性,客户端上传文件时会先将文件加密成MD5,然后服务端只需要对比一下服务端上的MD5就可以知道是否有这个文件了,如果有这个文件就不需要上传了,就达到“秒传”的效果。像网盘的原理也是这样的,服务器端不会有重复的文件,每个客户端下载、存储的其实都是同一个文件。

如果需要编写一个这种秒传机制的客户端和服务端,需要一个MD5加密类,一般在百度就能下载到,然后把这个类复制到工程目录下以备使用。

MD5加密类代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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);
}
  
}



客户端代码示例:

34d69f1215a69ece2065ebe35e4f6bce.png


服务端代码示例:

7c872b42b8496e95b44c294cdc4c12b5.png

f3f1e1ebafe4b87783a2d2c7a1486923.png



运行结果:

833d51279c4e9144d9edc6a152f8fc21.png




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976677,如需转载请自行联系原作者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值