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加密类代码:
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);
}
}
|
客户端代码示例:
服务端代码示例:
运行结果:
本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976677,如需转载请自行联系原作者