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