文件傳輸和秒傳

InetAddress類:

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加密類代碼:

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章