2016-1-3數據庫
ch17 網絡編程編程
網絡編程的基礎知識服務器
網絡基礎知識(拓撲結構,傳輸介質,通訊協議,TCP/IP協議)網絡
IP地址和端口號多線程
A,B,C,D,E五類IP併發
公認端口(0~1023),註冊端口(1024~49151),動態和私有端口(49152~65535)app
Java的基本網絡支持異步
使用InetAddresssocket
獲取InetAddress實例性能
getByName(String Host)
getByAddress(byte[] addr)
InetAddresss類提供了一個isReachable()方法用於測試是否能夠到達該地址
使用URLDecoder和URLEncoder
用於完成普通字符串與application/x-www-form-urlencoded MIME字符串之間的轉換
使用URL和URLConnection
資源能夠是簡單的文件或目錄,也能夠是對更復雜對象的引用,例如對數據庫或搜索引擎的查詢
URLConnection openConnection():返回一個URLConnection對象,它表明了與URL所引用的遠程對象的鏈接
InputStream openStream():打開與此URL的鏈接,並返回一個用於讀取該URL資源的InputStream
建立一個URL鏈接,併發送請求,讀取此URL應用的資源須要的步驟:
經過調用URL對象的openConnection()方法來建立URLConnection對象
設置URLConnection的參數和普通請求屬性
若是隻是發送GET請求,則使用connect()方法創建與遠程資源之間的實際鏈接便可;若是須要發送POST方式的請求,則須要獲取URLConnection實例對應的輸出流來發送請求參數
遠程資源變爲可用,程序能夠訪問遠程資源的頭字段或經過輸入流讀取遠程資源的數據。
若是程序要發送POST請求,則須要先設置doIn和doOut兩個請求頭字段的值,再使用URLConnection對應的輸出流來發送請求參數
無論是發送GET請求仍是發送POST請求,程序獲取URLConnection響應的方式徹底同樣——若是程序能夠肯定遠程響應是字符流,則能夠使用字符流來讀取;若是程序沒法肯定遠程響應是字符流,則使用字節流讀取便可
基於TCP協議的網絡編程
TCP協議基礎
使用ServerSocket建立TCP服務器端
ServerSocket ss=new ServerSocket(30000);
while(true)
{
Socket s=ss.accept();
...
}
使用Socket進行通訊
Socket s=new Socket(「127.0.0.1」,30000);//客戶端鏈接服務器端
Socket創建以後無須再區分服務器端,客戶端,經過各自的Socket進行通訊便可
InputStream getInputStream():返回該Socket對象對應的輸入流,讓程序經過該輸入流從Socket中取出數據
OutputStream getOutputStream():返回該Socket對象對應的輸出流,讓程序經過輸出流向Socket中輸出數據
讀寫超時和鏈接超時的設置
加入多線程
服務器爲每一個Socket單獨啓動一個線程,每一個線程負責與一個客戶端通訊
客戶端讀取服務器端數據的線程一樣會被阻塞,因此係統應該單獨啓動一個線程,該線程專門負責讀取服務器端數據
記錄用戶信息
實現自定義登陸協議,羣聊,私聊
半關閉的Socket
shutdownInput():關閉Socket的輸入流,isInputShutdown()
shutdownOutput():關閉Socket的輸出流,isOutputShutdown()
當調用Socket的shutdownInput()或shutdownOutput()方法關閉輸入流或輸出流以後,該Socket沒法再次打開輸出流或輸入流
使用NIO實現非阻塞Socket通訊
JDK1.4開始,開發高性能的網絡服務器
使用NIO API可讓服務器端使用一個或有限幾個線程來同時處理鏈接到服務器端的全部客戶端
Java的NIO爲非阻塞式Socket通訊提供了以下幾個特殊類:
Selector:位SelectableChannel對象的多路複用器,全部但願採用非阻塞方式進行通訊的Channel都應該註冊到Selector對象。
Selector能夠同時監控多個SelectableChannel的IO情況,這是非阻塞IO的核心。一個Selector實例有三個SelectionKey集合:
全部的SelectionKey集合:表明了註冊在該Selector上的Channel,這個集合能夠經過keys()方法返回;
被選擇的SelectionKey集合:表明了全部可經過select()方法獲取的,須要進行IO處理的Channel,這個集合能夠經過selectedKeys()返回;
被取消的SelectionKey集合:表明了全部被取消註冊關係的Channel,在下一次執行select()方法時,這些Channel對應的SelectionKey會被完全刪除,程序一般無須直接訪問該集合。
應用程序能夠調用SelectableChannel的register()方法將其註冊到指定的Selector上,當該Selector上的某些SelectableChannel上有須要處理的IO操做時,程序能夠調用Selector實例的select()方法獲取它們的數量,並能夠經過selectedKeys()方法返回他們對應的SelectionKey集合——經過集合就能夠獲取全部須要進行IO處理的SelectableChannel集
SelectionChannel對象支持阻塞和非阻塞兩種模式(全部的Channel默認都是阻塞模式),必須使用非阻塞模式才能利用非阻塞IO操做
服務器端的Selector僅須要監聽兩種操做:鏈接和讀數據
使用Java7的AIO實現非阻塞通訊
Java7的NIO.2提供了異步Channel支持,這種異步Channel能夠提供更高效的IO
若是按POSIX的標準來劃分IO,能夠把IO分爲兩類:同步IO和異步IO
AsynchronousServerSocketChannel是一個負責監聽的Channel,建立步驟:
調用open()靜態方法建立一個未監聽端口的AysnchronousServerSocketChannel
調用AsynchronousServerSocketChannel的bind()方法指定該Channel在指定地址,指定端口監聽
如何實現socket版HttpClient:http://wen866595.iteye.com/blog/1168658