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); } }
客戶端代碼示例:
服務端代碼示例:
運行結果: