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); } }
客户端代码示例:
服务端代码示例:
运行结果: