Java培訓(xùn)之IO流&網(wǎng)絡(luò)編程(二)
更新時間:2017-05-31 來源:黑馬程序員Java培訓(xùn)學(xué)院 瀏覽量:
網(wǎng)絡(luò)模型:|--OSI(open stystem Interconnection開放式系統(tǒng)互連)
|--特點:
是一種異構(gòu)系統(tǒng)互連的分層結(jié)構(gòu);提供了控制互連系統(tǒng)交互規(guī)則的標(biāo)準(zhǔn)骨架;定義一種抽象結(jié)構(gòu),而并非具體實現(xiàn)的描述;不同系統(tǒng)中相同層的實體為同等層實體;同等層實體之間通信由該層的協(xié)議管理;相信層間的接口定義了原語操作和低層向上層提供的服務(wù);所提供的公共服務(wù)是面向連接的或無連接的數(shù)據(jù)服務(wù);直接的數(shù)據(jù)傳送僅在最低層實現(xiàn);每層完成所定義的功能,修改本層的功能并不影響其他層。
|--七層結(jié)構(gòu):
物理層: 提供為建立、維護(hù)和拆除物理鏈路所需要的機(jī)械的、電氣的、功能的和規(guī)程的特性;有關(guān)的物理鏈路上傳輸非結(jié)構(gòu)的位流以及故障檢測指示。
數(shù)據(jù)鏈路層:在網(wǎng)絡(luò)層實體間提供數(shù)據(jù)發(fā)送和接收的功能和過程;提供數(shù)據(jù)鏈路的流控。
網(wǎng)絡(luò)層: 控制分組傳送系統(tǒng)的操作、路由選擇、擁護(hù)控制、網(wǎng)絡(luò)互連等功能,它的作用是將具體的物理傳送對高層透明。
傳輸層: 提供建立、維護(hù)和拆除傳送連接的功能;選擇網(wǎng)絡(luò)層提供最合適的服務(wù);在系統(tǒng)之間提供可靠的透明的數(shù)據(jù)傳送,提供端到端的錯誤恢復(fù)和流量控制。TCP(傳輸控制協(xié)議)傳輸效率低,可靠性強(qiáng),用于傳輸可靠性要求高,數(shù)據(jù)量大的數(shù)據(jù),UDP(用戶數(shù)據(jù)報協(xié)議,于TCP特性恰恰相反)用于傳輸可靠性要求 不高,數(shù)據(jù)量小的數(shù)據(jù),如QQ聊天數(shù)據(jù)就是通過這種方式進(jìn)行傳輸。
會話層: 提供兩進(jìn)程之間建立、維護(hù)和結(jié)束會話連接的功能;提供交互會話的管理功能,如三種數(shù)據(jù)流方向的控制,即一路交互、兩路交替和兩路同時會話模式 。
表示層: 代表應(yīng)用進(jìn)程協(xié)商數(shù)據(jù)表示;完成數(shù)據(jù)轉(zhuǎn)換、格式化和文本壓縮。
應(yīng)用層: 提供OSI用戶服務(wù),例如事務(wù)處理程序、文件傳送協(xié)議和網(wǎng)絡(luò)管理等。
|--TCP/IP:
|--TCP/IP的分層模型
Internet采用了TCP/IP協(xié)議,如同OSI參考模型,TCP/IP也是一種分層模型。
它是基于硬件層次上的四個概念性層次構(gòu)成,即網(wǎng)絡(luò)接口層、IP層、傳輸層、應(yīng)用層。
網(wǎng)絡(luò)接口層:也稱數(shù)據(jù)鏈路層,這是TCP/IP最底層。功能:負(fù)責(zé)接收IP數(shù)據(jù)報并發(fā)送至選定的網(wǎng)絡(luò)。
IP層:IP層處理機(jī)器之間的通信。功能:它接收來自傳輸層的請求,將帶有目的地址的分組發(fā)送出去。將分組封裝到數(shù)據(jù)報中,填入數(shù)據(jù)報頭,使用路由算法以決定是直接將數(shù)據(jù)報傳送至目的主機(jī)還是傳給路由器,然后把數(shù)據(jù)報送至相應(yīng)的網(wǎng)絡(luò)接口來傳送。
傳輸層:是提供應(yīng)用層之間的通信,即端到端的通信。功能:管理信息流,提供可靠的傳輸服務(wù),以確保數(shù)據(jù)無差錯的地按序到達(dá)。
2、TCP/IP模型的分界線
協(xié)議地址分界線:以區(qū)分高層和低層的尋址,高層尋址使用IP地址,低層尋址使用物理地址。應(yīng)用程序IP層之上的協(xié)議軟件只使用IP地址,而網(wǎng)絡(luò)接口層處理物理地址。
網(wǎng)絡(luò)通信要素|--IP地址:網(wǎng)絡(luò)中設(shè)備的標(biāo)示
127.0.0.1本地回環(huán)地址 主機(jī)名:localhost
IP地址不能沖突,但是可以重復(fù),在不同的網(wǎng)絡(luò)中的是可以重復(fù)的。
|--端口號:用于表示進(jìn)程的邏輯地址,不同進(jìn)程的標(biāo)示,有效端口:0`65535其中0~1024系統(tǒng)使用或者保留端口,
|--物理端口:即我們看的見的端口,比如網(wǎng)卡端口
|--邏輯端口:就是些數(shù)字標(biāo)示。
|--傳輸協(xié)議:
|--TCP:
|--特點:
建立連接,形成傳輸數(shù)據(jù)的通道在連接中進(jìn)行大數(shù)據(jù)量傳輸通過三次握手完成連接,是可靠協(xié)議,一旦連接斷開數(shù)據(jù)就不存在了必須建立連接、效率會稍低|--UDP:
|--特點:
將數(shù)據(jù)以及源和目的封裝成數(shù)據(jù)包,不需要建立連接每個數(shù)據(jù)報的大小在限制的64K內(nèi)因無連接,是不可靠的協(xié)議不要建立連接 ,速度快。IP地址對象:InetAddress:互聯(lián)網(wǎng)協(xié)議地址
getLocalHost();返回本地主機(jī)
getHostName();獲取主機(jī)名
getByName();
getAllByName();
地址解析:直接通過IP地址可以訪問新浪的主機(jī),同時也可以通過主機(jī)名去訪問。
百度校招筆試題:URL有哪幾個部分組成?協(xié)議、主機(jī)、端口、文件
DNS域名解析:客戶端輸入主機(jī)名去查找DNS服務(wù)器,查找對應(yīng)的IP地址,然后返回它客戶端在根據(jù)IP地址指向所要去訪問的主機(jī)。
擴(kuò)展:怎么去進(jìn)制掉上網(wǎng)過程中彈出的小廣告
去配置文件中一下面的格式配置即可
127.0.0.1 www.XXXX.com
eg:127.0.0.1 www.sina.com表示禁止不能上新浪網(wǎng).
Socket插座 (專業(yè)術(shù)語:套接字)
就是為網(wǎng)絡(luò)服務(wù)提供的一種機(jī)制。
通信的兩端都有Socket
網(wǎng)絡(luò)通信其實就Socket間通信
數(shù)據(jù)在兩個socket間通過IO傳輸。怎么去理解?
從這個設(shè)備傳輸?shù)搅硗庖粋€設(shè)備,其實就是流的操作。
UDP傳輸:DatagramSocket和 DatagramPacket
封裝了UPD的傳輸協(xié)議,此類表示用來發(fā)送和接收數(shù)據(jù)包的套接字。
receive(DatagramPacket p)和send(DatagramPacket p);
在構(gòu)造包時要注意,有些包是用來構(gòu)造接收數(shù)據(jù)包,有些是構(gòu)造發(fā)送數(shù)據(jù)包
怎么去區(qū)分:在構(gòu)造函數(shù)中凡是帶有Address的都是構(gòu)造發(fā)送數(shù)據(jù)包的。
UDP發(fā)送和接收端建立連接的思路:
啟動發(fā)送端和接收端都可以,啟動哪一個都是可以的。
實現(xiàn)代碼:
發(fā)送端:
//1、先建立UDP的socket服務(wù)。
DatagramSocket ds=new DatagramSocket();
//2、確定具體的數(shù)據(jù)。
String str="UDP,我來了!";//因為只能接受字節(jié)數(shù)組,所以下面要用字節(jié)數(shù)組封裝起來
byte[] buf=str.getBytes();
// 3、創(chuàng)建數(shù)據(jù)包對象將數(shù)據(jù)進(jìn)行封裝,并明確目的地地址。
DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.104"),10000);
// 4、使用socket服務(wù)的send方法將數(shù)據(jù)包發(fā)送出去。
ds.send(dp);
// 5、關(guān)閉資源。
ds.close();
接收端:
System.out.println("接收端啟動.....");
// 1、建立UDP的socket服務(wù),必須一個具體的數(shù)字標(biāo)示,明確是哪個端口的數(shù)據(jù)是這個程序是可以處理的。
DatagramSocket ds=new DatagramSocket(10000);
// 2、創(chuàng)建一個數(shù)據(jù)包對象,用于存儲接收到的數(shù)據(jù)
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
// 3、使用socket服務(wù)接收數(shù)據(jù)并存儲到已有的數(shù)據(jù)包當(dāng)中
ds.receive(dp);
// 4、從數(shù)據(jù)包中獲取指定的數(shù)據(jù),并打印
String ip=dp.getAddress().getHostAddress();
int port=dp.getPort();
String text=new String(dp.getData(),0,dp.getLength());
System.out.println(ip+""+text+""+port);
// 5、關(guān)閉socket服務(wù)
ds.close();
注意輸出結(jié)果中:
接收端啟動.....
192.168.1.104UDP,我來了!1364: 這個端口是發(fā)送端的。系統(tǒng)會隨機(jī)分配。
本文版權(quán)歸黑馬程序員Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員Java培訓(xùn)學(xué)院
首發(fā):http://javaee.itheima.com/