學(xué)習(xí)記錄之Java網(wǎng)絡(luò)編程
java網(wǎng)絡(luò)編程
網(wǎng)絡(luò)編程從大的方面就是說對(duì)信息的發(fā)送接收。
通過操作相應(yīng)API調(diào)度計(jì)算機(jī)資源硬件,并且利用管道(網(wǎng)線)進(jìn)行數(shù)據(jù)交互的過程。
更為具體的涉及:網(wǎng)絡(luò)模型、套接字、數(shù)據(jù)包
基礎(chǔ)層:物理層(physical)、數(shù)據(jù)鏈路層(Datalink)、網(wǎng)絡(luò)層(network).。
傳輸層(Transport):TCP-UDP協(xié)議層、Socket。
高級(jí)層::會(huì)話層(Session)、表示層(Presentation)、應(yīng)用層(Application)
Socket與TCP、UDP?
?Socket: 簡單來說是ip地址與端口的結(jié)合協(xié)議(RFC 793).
? ? ? ? ? ? ? 一種地址與端口的結(jié)合描述協(xié)議。
? ? ? ? ? ? ?TCP/IP協(xié)議的相關(guān)API的總稱;是網(wǎng)絡(luò)API的集合實(shí)現(xiàn).
? ? ? ? ? ? ? 涵蓋了Stream socket /Datagram Socket?
?socket 的組成與作用:
? ? ? ? ? ? ? 在網(wǎng)絡(luò)傳輸中用于唯一標(biāo)識(shí)兩個(gè)端點(diǎn)的鏈接。
? ? ? ? ? ? ? 端點(diǎn):包括(ip+port)
? ? ? ? ? ? ? 4個(gè)要素:客戶端的地址、客戶端的端口、服務(wù)器的地址、服務(wù)器端口。?
6. Socket的傳輸原理
Socket之TCP:
? ? ? ? ?tcp是面向連接的通訊協(xié)議。
? ? ? ? ?通過三次握手建立連接,通訊完成時(shí)要拆除連接。
? ? ? ? ?由于TCP是面向連接的,所以只能用于端到端的通信。
Socket之UDP:
? ? ? ? UDP是面向無連接進(jìn)行通訊的。
? ? ? ? UDP數(shù)據(jù)包括目的端口號(hào)和源端口號(hào)信息。
? ? ? ? 由于通訊時(shí)是不需要連接,所以可以是實(shí)現(xiàn)廣播發(fā)送,并不局限于端到端。
java.net.Socket
Socket(套接字)封裝了TCP協(xié)議的通訊細(xì)節(jié),是的我們使用它可以與服務(wù)端建立網(wǎng)絡(luò)鏈接,并通過?它獲取兩個(gè)流(一個(gè)輸入一個(gè)輸出),然后使用這兩個(gè)流的讀寫操作完成與服務(wù)端的數(shù)據(jù)交互
java.net.ServerSocket
ServerSocket運(yùn)行在服務(wù)端,作用有兩個(gè):
1:向系統(tǒng)申請(qǐng)服務(wù)端口,客戶端的Socket就是通過這個(gè)端口與服務(wù)端建立連接的。
2:監(jiān)聽服務(wù)端口,一旦一個(gè)客戶端通過該端口建立連接則會(huì)自動(dòng)創(chuàng)建一個(gè)Socket,并通過該Socket與客戶端進(jìn)行數(shù)據(jù)交互。
7.Client-Server Application
?TCP/IP協(xié)議中,兩個(gè)進(jìn)程間通信的主要模式為CS模型?
?主要的目的:協(xié)調(diào)網(wǎng)絡(luò)中計(jì)算機(jī)資源、服務(wù)模式、進(jìn)程間數(shù)據(jù)共享
?常見的FTP、SMTP、HTTP
8.報(bào)文段
? 報(bào)文段是指TCP/IP協(xié)議網(wǎng)絡(luò)傳輸過程中,起著路由導(dǎo)航作用。
? 可以查詢各個(gè)網(wǎng)絡(luò)路由網(wǎng)段、IP地址、交換協(xié)議等ip數(shù)據(jù)包。
? 報(bào)文段充當(dāng)整個(gè)TCP/IP協(xié)議數(shù)據(jù)包的導(dǎo)航路由功能。
? 報(bào)文在傳輸過程中會(huì)不斷的封裝成分組、包、幀來傳輸。
? 封裝的方式就是添加一些控制信息組成的首部,即報(bào)文頭。
9.傳輸協(xié)議
? ?一種約定,約束
? ?約定大于配置,在網(wǎng)絡(luò)傳輸中依然實(shí)用;網(wǎng)絡(luò)的傳輸是健壯的穩(wěn)定的,得益于基礎(chǔ)的協(xié)議構(gòu)成。
如果我們把Socket比喻為電話,那么ServerSocket相當(dāng)于是某客服中心的總機(jī)。
與服務(wù)端建立連接案例:
客戶端與服務(wù)端完成第一次通訊(發(fā)送一行字符串)
Socket提供了兩個(gè)重要的方法:
OutputStream getOutputStream()
該方法會(huì)獲取一個(gè)字節(jié)輸出流,通過這個(gè)輸出流寫出的字節(jié)數(shù)據(jù)會(huì)通過網(wǎng)絡(luò)發(fā)送給對(duì)方。
InputStream getInputStream()
通過該方法獲取的字節(jié)輸入流讀取的是遠(yuǎn)端計(jì)算機(jī)發(fā)送過來的數(shù)據(jù)。

客戶端代碼:
服務(wù)端代碼:
需要注意的幾個(gè)點(diǎn):
1:當(dāng)客戶端不再與服務(wù)端通訊時(shí),需要調(diào)用socket.close()斷開鏈接,此時(shí)會(huì)發(fā)送斷開鏈接的信號(hào)給服務(wù)端。這時(shí)服務(wù)端的br.readLine()方法會(huì)返回null,表示客戶端斷開了鏈接。
2:當(dāng)客戶端鏈接后不輸入信息發(fā)送給服務(wù)端時(shí),服務(wù)端的br.readLine()方法是出于阻塞狀態(tài)的,直到讀取了一行來自客戶端發(fā)送的字符串。