教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓(xùn)之IO流&網(wǎng)絡(luò)編程

更新時(shí)間:2016年06月30日15時(shí)58分 來源:傳智播客Java培訓(xùn)學(xué)院 瀏覽次數(shù):

1、編碼表:|--由來:計(jì)算機(jī)只能識(shí)別二進(jìn)制數(shù)據(jù),早期由來的是電信號(hào),為了方便計(jì)算機(jī)能識(shí)別各個(gè)國家的文字,就將各個(gè)國家的文字用數(shù)字來表示,并一一對(duì)應(yīng),形成了編碼表。
|--常見碼表:
|--ASCII:一個(gè)字節(jié)中7位就已經(jīng)可以表示英文中的內(nèi)容了。
|--ISO8859-1:包含了ASCII,同時(shí)用了一個(gè)字節(jié)的最高位。
|--GB2312/GBK:用兩個(gè)字節(jié)表示各種文字。()
|--Unicode:國際標(biāo)準(zhǔn)碼表,全部用兩個(gè)字節(jié)表示各種文字(java中默認(rèn)的就是用這個(gè)碼表,對(duì)于字符串使用的本地默認(rèn)碼表是GBK)
|--UTF-8:一個(gè)字節(jié)能存的就用一個(gè)字節(jié)存儲(chǔ),兩個(gè)字節(jié)存不了的用三個(gè)字節(jié)存儲(chǔ)。在編碼的時(shí)候會(huì)給每個(gè)字節(jié)加個(gè)標(biāo)示頭。這樣做的好處是:標(biāo)示相當(dāng)清楚,只要讀取標(biāo)示就可以知道該怎么去查表。
Eg:01010101 11010101 10101111 11101101 10101010 10111100
當(dāng)讀取到第一個(gè)字符時(shí),就回去查ASCII碼表,因?yàn)?開頭就是用一個(gè)字節(jié)存儲(chǔ)的,當(dāng)讀第二個(gè)字節(jié)時(shí),110開頭的時(shí)繼續(xù)讀下一個(gè)字節(jié),因?yàn)閁TF-8有固定的標(biāo)示頭110開頭代表是存兩個(gè)字節(jié),當(dāng)讀到1110時(shí)會(huì)繼續(xù)讀三個(gè)字節(jié),如果是GBK讀這些,讀到第一個(gè)字節(jié)時(shí)也會(huì)查表。因?yàn)锳SCII碼表兼容,當(dāng)讀到1時(shí)會(huì)繼續(xù)讀下一個(gè)字節(jié)。
面試題:char類型中能不能存儲(chǔ)一個(gè)漢字?
Eg:char ch='a';就是兩個(gè)字節(jié),只是最高八位全部都是0;
Char類型變量是用來存儲(chǔ)Unicode編碼的字符,該編碼字符集中包含了漢字,
所以char類型的變量是可以存儲(chǔ)漢字,不過如果某些特殊的漢字沒有被包含在該字符集中,那么這個(gè)char類型變量中就不能存儲(chǔ)這個(gè)漢字,這些都是因?yàn)閁nicode編碼表全部都是用兩個(gè)字節(jié)表示各種文字。
|--編碼:字符串變成字節(jié)數(shù)組(把看的懂的變成看不懂的)
編碼錯(cuò)了是不可能改正的,如果編對(duì)了解錯(cuò)了還是有可能改正的。
實(shí)現(xiàn)代碼:
|--解碼:字節(jié)數(shù)組變成字符串(把看不懂的變成看的懂的)
Eg:客戶端發(fā)送你好到服務(wù)端
你好--------->你好 -60,-29,-70,-61------>ISO8859-1進(jìn)行解碼---->????------->對(duì)它進(jìn)行編碼------->-60,-29,-70,-61--->對(duì)它進(jìn)行解碼----->你好
|--聯(lián)通問題:
實(shí)現(xiàn)代碼:
public static void main(String[] args) throws UnsupportedEncodingException {
String str="聯(lián)通";
/*
 *  11000001
10101010
11001101
10101000
通過這里發(fā)現(xiàn)聯(lián)通對(duì)應(yīng)的四個(gè)字節(jié)的開頭正好是UTF-8對(duì)應(yīng)存儲(chǔ)兩個(gè)字節(jié)的開頭,所以它在解碼的時(shí)候按照UTF-8的方式進(jìn)行解碼
出現(xiàn)了亂碼
 * */
byte[] buf=str.getBytes("GBK");
for(byte b:buf){
System.out.println(Integer.toBinaryString(b&0xff));//獲取二進(jìn)制的方式,已經(jīng)忘記了!注意復(fù)習(xí)!
}
}

  1. 網(wǎng)絡(luò)模型:
|--OSI(open stystem Interconnection開放式系統(tǒng)互連)
|--特點(diǎn):
是一種異構(gòu)系統(tǒng)互連的分層結(jié)構(gòu);提供了控制互連系統(tǒng)交互規(guī)則的標(biāo)準(zhǔn)骨架;定義一種抽象結(jié)構(gòu),而并非具體實(shí)現(xiàn)的描述;不同系統(tǒng)中相同層的實(shí)體為同等層實(shí)體;同等層實(shí)體之間通信由該層的協(xié)議管理;相信層間的接口定義了原語操作和低層向上層提供的服務(wù);所提供的公共服務(wù)是面向連接的或無連接的數(shù)據(jù)服務(wù);直接的數(shù)據(jù)傳送僅在最低層實(shí)現(xiàn);每層完成所定義的功能,修改本層的功能并不影響其他層。
|--七層結(jié)構(gòu):
物理層: 提供為建立、維護(hù)和拆除物理鏈路所需要的機(jī)械的、電氣的、功能的和規(guī)程的特性;有關(guān)的物理鏈路上傳輸非結(jié)構(gòu)的位流以及故障檢測指示。
數(shù)據(jù)鏈路層:在網(wǎng)絡(luò)層實(shí)體間提供數(shù)據(jù)發(fā)送和接收的功能和過程;提供數(shù)據(jù)鏈路的流控。
網(wǎng)絡(luò)層: 控制分組傳送系統(tǒng)的操作、路由選擇、擁護(hù)控制、網(wǎng)絡(luò)互連等功能,它的作用是將具體的物理傳送對(duì)高層透明。
傳輸層: 提供建立、維護(hù)和拆除傳送連接的功能;選擇網(wǎng)絡(luò)層提供最合適的服務(wù);在系統(tǒng)之間提供可靠的透明的數(shù)據(jù)傳送,提供端到端的錯(cuò)誤恢復(fù)和流量控制。TCP(傳輸控制協(xié)議)傳輸效率低,可靠性強(qiáng),用于傳輸可靠性要求高,數(shù)據(jù)量大的數(shù)據(jù),UDP(用戶數(shù)據(jù)報(bào)協(xié)議,于TCP特性恰恰相反)用于傳輸可靠性要求 不高,數(shù)據(jù)量小的數(shù)據(jù),如QQ聊天數(shù)據(jù)就是通過這種方式進(jìn)行傳輸。
會(huì)話層: 提供兩進(jìn)程之間建立、維護(hù)和結(jié)束會(huì)話連接的功能;提供交互會(huì)話的管理功能,如三種數(shù)據(jù)流方向的控制,即一路交互、兩路交替和兩路同時(shí)會(huì)話模式 。
表示層: 代表應(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è)概念性層次構(gòu)成,即網(wǎng)絡(luò)接口層、IP層、傳輸層、應(yīng)用層。
網(wǎng)絡(luò)接口層:也稱數(shù)據(jù)鏈路層,這是TCP/IP最底層。功能:負(fù)責(zé)接收IP數(shù)據(jù)報(bào)并發(fā)送至選定的網(wǎng)絡(luò)。
IP層:IP層處理機(jī)器之間的通信。功能:它接收來自傳輸層的請(qǐng)求,將帶有目的地址的分組發(fā)送出去。將分組封裝到數(shù)據(jù)報(bào)中,填入數(shù)據(jù)報(bào)頭,使用路由算法以決定是直接將數(shù)據(jù)報(bào)傳送至目的主機(jī)還是傳給路由器,然后把數(shù)據(jù)報(bào)送至相應(yīng)的網(wǎng)絡(luò)接口來傳送。
傳輸層:是提供應(yīng)用層之間的通信,即端到端的通信。功能:管理信息流,提供可靠的傳輸服務(wù),以確保數(shù)據(jù)無差錯(cuò)的地按序到達(dá)。
2、TCP/IP模型的分界線
協(xié)議地址分界線:以區(qū)分高層和低層的尋址,高層尋址使用IP地址,低層尋址使用物理地址。應(yīng)用程序IP層之上的協(xié)議軟件只使用IP地址,而網(wǎng)絡(luò)接口層處理物理地址。

  1. 網(wǎng)絡(luò)通信要素
|--IP地址:網(wǎng)絡(luò)中設(shè)備的標(biāo)示
127.0.0.1本地回環(huán)地址 主機(jī)名:localhost
IP地址不能沖突,但是可以重復(fù),在不同的網(wǎng)絡(luò)中的是可以重復(fù)的。
|--端口號(hào):用于表示進(jìn)程的邏輯地址,不同進(jìn)程的標(biāo)示,有效端口:0`65535其中0~1024系統(tǒng)使用或者保留端口,
|--物理端口:即我們看的見的端口,比如網(wǎng)卡端口
|--邏輯端口:就是些數(shù)字標(biāo)示。
|--傳輸協(xié)議:
|--TCP:
|--特點(diǎn):

  1. 建立連接,形成傳輸數(shù)據(jù)的通道
  2. 在連接中進(jìn)行大數(shù)據(jù)量傳輸
  3. 通過三次握手完成連接,是可靠協(xié)議,一旦連接斷開數(shù)據(jù)就不存在了
  4. 必須建立連接、效率會(huì)稍低
|--UDP:
|--特點(diǎn):

  1. 將數(shù)據(jù)以及源和目的封裝成數(shù)據(jù)包,不需要建立連接
  2. 每個(gè)數(shù)據(jù)報(bào)的大小在限制的64K內(nèi)
  3. 因無連接,是不可靠的協(xié)議
  4. 不要建立連接 ,速度快。
  1. IP地址對(duì)象:
InetAddress:互聯(lián)網(wǎng)協(xié)議地址
getLocalHost();返回本地主機(jī)
getHostName();獲取主機(jī)名
getByName();
getAllByName();
地址解析:直接通過IP地址可以訪問新浪的主機(jī),同時(shí)也可以通過主機(jī)名去訪問。
百度校招筆試題:URL有哪幾個(gè)部分組成?協(xié)議、主機(jī)、端口、文件
DNS域名解析:客戶端輸入主機(jī)名去查找DNS服務(wù)器,查找對(duì)應(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).

  1. Socket
插座 (專業(yè)術(shù)語:套接字)
就是為網(wǎng)絡(luò)服務(wù)提供的一種機(jī)制。
通信的兩端都有Socket
網(wǎng)絡(luò)通信其實(shí)就Socket間通信
數(shù)據(jù)在兩個(gè)socket間通過IO傳輸。怎么去理解?
從這個(gè)設(shè)備傳輸?shù)搅硗庖粋€(gè)設(shè)備,其實(shí)就是流的操作。

  1. UDP傳輸:
DatagramSocket和 DatagramPacket
封裝了UPD的傳輸協(xié)議,此類表示用來發(fā)送和接收數(shù)據(jù)包的套接字。
receive(DatagramPacket p)和send(DatagramPacket p);
在構(gòu)造包時(shí)要注意,有些包是用來構(gòu)造接收數(shù)據(jù)包,有些是構(gòu)造發(fā)送數(shù)據(jù)包
怎么去區(qū)分:在構(gòu)造函數(shù)中凡是帶有Address的都是構(gòu)造發(fā)送數(shù)據(jù)包的。
UDP發(fā)送和接收端建立連接的思路:
啟動(dòng)發(fā)送端和接收端都可以,啟動(dòng)哪一個(gè)都是可以的。
實(shí)現(xiàn)代碼:
發(fā)送端:
//1、先建立UDP的socket服務(wù)。
DatagramSocket ds=new DatagramSocket();
//2、確定具體的數(shù)據(jù)。
String str="UDP,我來了!";//因?yàn)橹荒芙邮茏止?jié)數(shù)組,所以下面要用字節(jié)數(shù)組封裝起來
byte[] buf=str.getBytes();
// 3、創(chuàng)建數(shù)據(jù)包對(duì)象將數(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("接收端啟動(dòng).....");
// 1、建立UDP的socket服務(wù),必須一個(gè)具體的數(shù)字標(biāo)示,明確是哪個(gè)端口的數(shù)據(jù)是這個(gè)程序是可以處理的。
DatagramSocket ds=new DatagramSocket(10000);
// 2、創(chuàng)建一個(gè)數(shù)據(jù)包對(duì)象,用于存儲(chǔ)接收到的數(shù)據(jù)
byte[] buf=new byte[1024];
DatagramPacket dp=new DatagramPacket(buf, buf.length);
// 3、使用socket服務(wù)接收數(shù)據(jù)并存儲(chǔ)到已有的數(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é)果中:
接收端啟動(dòng).....
192.168.1.104UDP,我來了!1364: 這個(gè)端口是發(fā)送端的。系統(tǒng)會(huì)隨機(jī)分配。
 
本文版權(quán)歸傳智播客Java培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Java培訓(xùn)學(xué)院
首發(fā):http://metathetuscanyresort.com/javaee
0 分享到:
和我們?cè)诰€交談!