Socket IO與NIO(二)

UDP:

英文:User Datagram Protocal,縮寫爲UDP。 是一種用戶數據報協議,又叫用戶數據報文協議。數組

是一個簡單的面向數據報的傳輸層協議,正式規範爲RFC 768。bash

用戶數據協議,非鏈接協議。他不須要兩個客戶端必定是鏈接的。服務器

爲何不可靠?

TCP是面向鏈接的,是傳輸可靠的。UDP是面向數據報的。網絡

他一旦把應用程序發給網絡層的數據發送出去,就不保留數據備份。即在UDP的數據層面,他只管發送或者是接受數據,而不對這些數據進行保存,備份,重發等等。框架

UDP在IP數據報的頭部僅僅加入複用和數據校驗(字段)。ui

發送端生成數據,接收端從網絡中抓取數據。因此他們二者是不須要進行鏈接的。UDP當中是沒有標準的客戶端和服務器端。spa

結構簡單、無校驗、數獨快、容易丟包、可廣播。code

UDP能作什麼?

DNS TFTP(文件傳輸的協議) SNMP(網絡數據傳輸當中的一個監控協議) 視頻、音頻、普通數據(可有可無數據)視頻

Bit# | 0 7 | 8 15 | 16 23 | 24 31 |
 0                  Source Port                |                 Destination Port
 32                 Length                     |             Header and Data Checksum
複製代碼

加在一塊兒就是64位。前面用了32位保存端口號,端口號用短整型來存儲,緊接着16位是用了存儲後面數據的長度,也是短整型存儲,後16位存儲的是頭部和數據校驗。資源

UDP包最大的長度是?

16位->2字節,存儲長度信息。

2^16-1 = 64K-1 = 65536-1=65535個字節長。

自身協議佔用:32+32位 = 64位 = 8字節。

65535-8 = 65507 byte

API-DatagramSocket:

用於接受與發送UDP的類。

負責發送某一個UDP包,或者接受UDP包。

不一樣於TCP,UDP並無合併到SocketAPI當中。在UDP當中是沒有服務器與客戶端的概念,你的DatagramSocket便是你的服務器也是你的客戶端。 他能夠發送也能夠接受,他不須要去監聽某一個客戶端,由於他涉及客戶端跟他的鏈接,他不像TCP同樣須要先去監聽一個TCP的來源,而後鏈接TCP,而後再進行通訊。UDP通訊就至關於兩個服務器之間的傳輸或者連個客戶端之間的傳輸,他沒有服務器端也沒有客戶端,他便是服務器也是客戶端。

DatagramSocket()建立簡單實例,不指定端口與IP。他會複用你本機可用的端口,IP就是你本機的IP。
DatagramSocket(int port)建立監聽固定端口的實例,這個端口指的是你接受數據的端口。
DatagramSocket(int port, InetAddress localAddr)建立固定端口指定IP的實例,當你的本地有多個IP地址的時候有效,你能夠指定只監聽你
局域網某一個端口,或者你是想監聽互聯網某一個IP的端口,由於你的電腦可能具有多個IP地址。
receive(DatagramSocket d) 接受。
send(DatagramSocket d) 發送。
setSoTimeout(int timeout):設置超時時間,毫秒。
close() 關閉釋放資源。
複製代碼

API-DatagramPacket:

用於處理報文。經過他來指定你具體的接受着的信息,他的信息是什麼?是經過DatagramPacket來進行設置。

將byte數組、目標地址、目標端口等數據包裝成報文或者將報文拆卸成byte數組。

DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)。

前面3個參數指定buf的使用區間。

後面2個參數指定目標機器地址與端口。

SocketAddress至關於InetAddress+Port。

setData(byte[] buf, int offset, int length)
setData(byte[] buf)
setLength(int length)
getData()、getOffset()、getlength()
setAddress(InetAddress iaddr),setPort(int port)
getAddress(),getPort()
setSocketAddress(SocketAddress address)
getSocketAddress()
複製代碼

UDP單播就是點對點,兩個點之間的通訊不會被其餘點所感知。

UDP多播應該叫組播,他是給某一組設備發送。例如說全部的男生請過來,那麼這個時候男生就是一組,女生以及其餘性別無關 他們不會收到信。 他可以給指定的一組設備發送信息。例如我看着廣場下面有男生,女生,我直接過去把全部的男生都挑出來,挑出來以後,我直接對這一部分 男生說,我雖然也是直接對一批人說,可是我提早會進行篩選,提取出我真正有用的這一部分設備,而後我再對這一部分設備進行發送信息,這時候我這一部分設備必定是對這信息感興趣的。 UDP廣播就是全部的設備都發送信息。例如你給局域網發送信息或者局域網之外發送信息。就是你直接在你所在的網段發送一條信息,至於這個網段以內那些設備會對你這個信息感興趣,那就是對應設備該作的處理了。最早出來的單播,而後是廣播,最後是多播。多播比廣播更優越。

IP地址類別:

廣播地址:

255.255.255.255爲受限的廣播地址。其實只有你局域網內的設備可以收到你發送的這個信息,至於他對這個信息感不感興趣就看他對沒對2000端口進行監聽。

C網的廣播地址通常爲:XXX.XXXX.XXX.255(192.168.1.255),若是你要給你所在局域網發送廣播信息,地址能夠是255.255.255.255或192.168.1.255通常而言廣播地址就是最後爲255。

D類IP地址爲多播預留。

IP地址構成: 8+8+8+8=32 Bits

廣播地址運算: 廣播地址是不固定的是運算出來的。

IP 192.168.124.7
子網掩碼 255.255.255.0
網絡地址 192.168.124.0
廣播地址:192.168.124.255

IP 192.168.124.7
子網掩碼 255.255.255.192
網絡地址 192.168.124.0
廣播地址:192.168.124.63
廣播地址怎麼運算呢?
255.255.255.192 -> 11111111.11111111.11111111.11000000
可劃分的網段是:2^2 = 4個,由於11000000中有2個1
0-64,64-127,128-191,192-255
個人IP是192.168.124.7,7是第一個網段,這時個人保留地址是192.168.124.0,廣播地址就是最後一位192.168.124.63。
複製代碼

廣播通訊問題:

主機一 192.168.124.7     子網掩碼 255.255.255.192
主機二 192.168.124.100   子網掩碼 255.255.255.192
主機一發送廣播信息,主機二能收到信息嗎?不能
主機一廣播地址 192.168.124.63
主機二廣播地址 192.168.124.127
複製代碼

單播:

以前講的UDP實際上是有客戶端也有服務端的功能,具體表現爲何樣的呢?

好比機器A,機器B,兩臺計算機之間想要發送一個廣播,怎麼實現的呢?

首先A發送一個消息給B,B是否是必定可以接受呢?不是。

若是這麼簡單的A往B發送消息就能實現的話,那麼我往局域網發送一個消息,局域網的其餘的全部設備都能收到這個消息並可以處理這個消息的話,那麼咱們的傳輸會致使咱們整個傳輸互聯網框架的一個癱瘓,那麼它確定要遵循必定的守則,守則是什麼樣的呢?首先咱們認爲B計算機應該要監聽一個端口(2000),那麼他在監聽這個端口的時候,全部到到這個端口上的UDP信息,那麼他將會處理,這個時候A往B2000端口發送一條消息,這個時候B就能接受到並處理這條消息。固然他在處理這條消息的時候,前面有說過,咱們的一個UDP包當中他有64位前面有存儲發送源的端口和目標源的端口,目標源就是2000,發送端的話多是一個隨機端口(1000),當B收到消息的時候,他就已經知道A的端口號了,同理在B獲得這個端口以後的話,那麼B能夠基於這個1000端口回送一條消息,至於A是否有能力去接受這個消息,由A本身決定,A若是在發送以後,咱們緊接着進行了一次接受的操做,而且就在當前的鏈接上面進行接受的話,B回送了一個消息,那麼A將會受到,這就實現了一個AB之間的一個信息的交互的過程。

廣播:

A與B C D屬於同一個局域網。

B C D都是提供者的身份,都監聽各自的20000端口,A能夠發送一條信息到受限廣播地址,那麼B C D都會收到這條消息,3個收到消息以後,緊跟着A發送的消息當中,A能夠告訴他說你給我回送到30000端口上來,B收到消息以後 若是解析成功的話,那麼給A的30000端口回送一條消息,C和D都同樣 會回送一條消息,回送回來消息,那麼A要作一件什麼事情呢?A他首先在發送我前面這條搜索消息以前他先要監聽30000端口,他必需要先處於一個30000端口的監聽狀態下,他才能收到B C D3臺設備發送過來的信息,固然這不是必然,有可能A剛剛發送完成以後馬上進行一個30000端口的監聽,這也是能夠的,可是他不保證100%的可行,咱們爲了讓他保證必定的成功率的話,能夠先進行一個30000端口的監聽,而後給局域網內全部的設備發送20000端口的一個指定的信息,這個指定的信息就是約定好的信息格式,也就是咋們的一個口令,口令信息發送出去以後,可以被B CD設備所解析,解析完成 以後B C D可以回送一個消息回來,那麼回送呢,他也是一個口令模式,那麼首先要作的事情就是設定口令,而且要監聽,而後發送,發送以後B C D要可以收到消息,收到消息以後要可以持續回送,同事B C D不該該回送以後就中止,他應該是一個持續的過程,它可以持續一段時間以內都可以處於一個收到信息回送的這樣一個功能,這就是一個發現模式。

相關文章
相關標籤/搜索