最近讀完《Java網(wǎng)絡(luò)編程》(第四版),有必要記錄下,還是國(guó)外作者給力,內(nèi)容相當(dāng)翔實(shí)而且核心點(diǎn)分析到位,沒有太多余的內(nèi)容,更沒有不必要的炫技。內(nèi)容主要是介紹java的網(wǎng)絡(luò)API的使用,基本可以滿足絕大部分的網(wǎng)絡(luò)應(yīng)用場(chǎng)景。由于對(duì)底層通訊做了封裝,所以使用起來難度不大,效率也基本能滿足需求,有計(jì)劃應(yīng)用再公司的一些業(yè)務(wù)場(chǎng)景中。
大綱如下:

一、流
網(wǎng)絡(luò)程序絕大部分的工作都是處理輸入和輸出:將數(shù)據(jù)字節(jié)從一個(gè)系統(tǒng)移動(dòng)到另一個(gè)系統(tǒng)。
輸入流讀取數(shù)據(jù)(read),輸出流寫入數(shù)據(jù)(write)
Java7引入了“帶資源的try”,可以這樣編寫流操作代碼
try (OutputStream out = new FileOutputStream("text.txt")) {
// TO-DO
} catch (IOException e) {
// 異常處理
}
過濾器流(filter)過濾器可以在讀寫時(shí)修改數(shù)據(jù)(例如,通過加密或壓縮)或者只是提供額外的方法,將讀寫的數(shù)據(jù)轉(zhuǎn)換為其他格式。
閱讀器(reader)和書寫器(writer)可以鏈接到輸入流和輸出流上,允許讀寫文本(即字符)而不是字節(jié)。只要正確地使用,閱讀器和書寫器可以處理很多字符編碼,包括多字節(jié)字符集。
二、線程
線程是一個(gè)相當(dāng)大的范疇,這里只是簡(jiǎn)單講解了線程的基本概念以及使用方法,詳情查閱相關(guān)線程技術(shù)資料。
獲得線程返回值:
1、通過runnable的callback
2、通過ExcutorService的submit方法執(zhí)行Callable對(duì)象獲得Future,再從Future獲得內(nèi)容返回值
四、Internet地址
InternetAddress對(duì)象
InetAddress address = InetAddress.getByName("www.baidu.com");
System.out.println(address);
NetworkInterface類
表示一個(gè)本地IP地址
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface ni = interfaces.nextElement();
System.out.println(ni);
}
五、URL和URI
URI:統(tǒng)一資源標(biāo)識(shí)符
URL:是一個(gè)URI,還為資源指定了一個(gè)網(wǎng)絡(luò)地址
URL類
URL u = new URL("www.baidu.com")
u.openStream
u.openConnection
...
...
URI類
URI u = new URI("tel:+8618620000000")
URI u = new URI("http", "http://www.baidu.com", null);
System.out.println(u.getScheme());
六、HTTP
HTTP協(xié)議是Web瀏覽器和Web服務(wù)器之間的通信協(xié)議。
HTTP方法:GET、POST、PUT、DELETE、HEAD、OPTIONS、TRACE
五、URLConnection
URLConnection是一個(gè)抽象類,表示指向URL指定資源的活動(dòng)連接??梢詮腎nputStream中獲取流內(nèi)容。
try {
URL u = new URL("http://www.baidu.com");
URLConnection connection = u.openConnection();
System.out.println(connection.getDate());
} catch (Exception e) {
e.printStackTrace();
}
緩存實(shí)現(xiàn)
七、客戶端Socket、服務(wù)端Socket、安全Socket
可以通過Socket連接,連通客戶端和服務(wù)器端,實(shí)現(xiàn)信息流轉(zhuǎn)。安全Socket允許設(shè)置簽名規(guī)則實(shí)現(xiàn)通信的加密。
(后續(xù)補(bǔ)上實(shí)現(xiàn)Demo)
八、非阻塞IO(NIO)
以上的IO通信都是阻塞通信,會(huì)有一定的性能問題。java支持非阻塞IO的通信方式,通過SockerChannel實(shí)現(xiàn)數(shù)據(jù)回傳,不影響主業(yè)務(wù)正常執(zhí)行。
(后續(xù)補(bǔ)上實(shí)現(xiàn)Demo)
九、UDP
上面的通信方式都是TCP連接方式,需要經(jīng)過三次握手才能建立連接,連接結(jié)束后會(huì)斷開。TCP是可靠連接,UDP是不可靠連接,可能會(huì)有丟幀的情況,但效率高。
通過DatagramSocket建立UDP連接,傳輸?shù)臄?shù)據(jù)通過DatagramPackege進(jìn)行封裝。通過send和receive方法發(fā)送和接收數(shù)據(jù)。
(后續(xù)補(bǔ)上實(shí)現(xiàn)Demo)
十、IP組播
廣域網(wǎng)無實(shí)際應(yīng)用價(jià)值,局域網(wǎng)內(nèi)可進(jìn)行配置應(yīng)用,如企業(yè)內(nèi)網(wǎng)、校園網(wǎng)等。