Sipdroid疑惑之什麼是UDP數據包連接?

在Sipdroid開源項目像服務器進行數據的發送統一是由SipProvider的sendMessage,這個sendMessage也是一個技術活啊,因爲首先得知道是什麼連接吧,是UDP啊,還是TCP,然後就是message的封裝超級複雜,設計的東東太多了.

Sipdroid中涉及和運用到的兩種連接方式:
/** UDP transport */
UdpTransport udp = null;

/** Tcp server */
TcpServer tcp_server = null;

TCP走的是請求-問答的模型,首先和服務器進行連接,然後發請求,服務器接收到了請求後再處理你的請求,根據你的請求來給你返回數據,這個咱們用的多,比較的好理解,但是UDP呢,今天詳細的介紹下Socket中的UDP.

JAVA API中的文檔說明-(UDP連接中數據是以DatagramPacket數據報包的形式發送的)


public final class DatagramPacketextends object此類表示數據報包。 數據報包用來實現無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證。

此類表示數據報包。 數據報包用來實現無連接包投遞服務。每條報文僅根據該包中包含的信息從一臺機器路由到另一臺機器。從一臺機器發送到另一臺機器的多個包可能選擇不同的路由,也可能按不同的順序到達。不對包投遞做出保證.

看到沒,是無連接的包投遞服務,爲什麼是無連接呢,客戶端和服務器壓根就沒有建立連接,服務器只是開放了端口來接受數據,有了就接受,沒有就懸掛阻塞.

DatagramSocket


public void receive(  DatagramPacket p)             throws IOException
從此套接字接收數據報包。當此方法返回時,DatagramPacket 的緩衝區填充了接收的數據。數據報包也包含發送方的 IP 地址和發送方機器上的端口號。 此方法在接收到數據報前一直阻塞。數據報包對象的 length 字段包含所接收信息的長度。如果信息包的長度太長,該信息將被截短。 如果存在安全管理器,而安全管理器的 checkAccept 方法不允許接收操作,則包不能被接收.


接受數據是通過DatagramSocket來進行接受的,receive是一個阻塞的方法,在沒有接收到數據之前會一直阻塞,所以一般的手機上的網絡遊戲都是採用這種方式來進行數據的發送,如果採用TCP/IP那麼客戶端和服務器每隔一定的時間就必須交互一次來保持連接.

(剛問了一同學,他們做網遊採用的是TCP/IP每隔一段的時間就和服務器交互一次,那流量肯定燒的很快)

使用無連接的數據報(UDP) 進行通信
什麼是Datagram?
數據報是網上傳輸的獨立數據包 ,數據報是否能正確地到達目的地,到達的時間,順序,內容的正確性均沒有保障。


正是因爲這樣的原因,有的時候我們在測試Sipdroid的時候有時候會碰到老是無法打通的情況.

Socket數據報圖文解釋:http://whp0731.javaeye.com/blog/470130


轉自http://www.shouyanwang.org/thread-4-1-1.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章