分類: java2011-09-30 10:26 801人閱讀 評論(0) 收藏 舉報java
stringexceptiontcpbyteimportclass網絡
TCP(Transmission Control Protocol,傳輸控制協議)是基於鏈接的協議,也就是說,在正式收發數據前,必須和對方創建可靠的鏈接。一個TCP鏈接必需要通過三次「對話」才能創建起來,其中的過程很是複雜,咱們這裏只作簡單、形象的介紹,你只要作到可以理解這個過程便可。咱們來看看這三次對話的簡單過程:主機A向主機B發出鏈接請求數據包:「我想給你發數據,能夠嗎?」,這是第一次對話;主機B向主機A發送贊成鏈接和要求同步(同步就是兩臺主機一個在發送,一個在接收,協調工做)的數據包:「能夠,你何時發?」,這是第二次對話;主機A再發出一個數據包確認主機B的要求同步:「我如今就發,你接着吧!」,這是第三次對話。三次「對話」的目的是使數據包的發送和接收同步,通過三次「對話」以後,主機A才向主機B正式發送數據。
UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議。它是面向非鏈接的協議,它不與對方創建鏈接,而是直接就把數據包發送過去!
UDP適用於一次只傳送少許數據、對可靠性要求不高的應用環境。好比,咱們常常使用「ping」命令來測試兩臺主機之間TCP/IP通訊是否正常,其實「ping」命令的原理就是向對方主機發送UDP數據包,而後對方主機確認收到數據包,若是數據包是否到達的消息及時反饋回來,那麼網絡就是通的。例如,在默認狀態下,一次「ping」操做發送4個數據包(如圖2所示)。你們能夠看到,發送的數據包數量是4包,收到的也是4包(由於對方主機收到後會發回一個確認收到的數據包)。這充分說明了UDP協議是面向非鏈接的協議,沒有創建鏈接的過程。正由於UDP協議沒有鏈接的過程,因此它的通訊效果高;但也正由於如此,它的可靠性不如TCP協議高。QQ就使用UDP發消息,所以有時會出現收不到消息的狀況。
tcp協議和udp協議的差異
TCP UDP
是否鏈接 面向鏈接 面向非鏈接
傳輸可靠性 可靠 不可靠
應用場合 傳輸大量數據 少許數據
速度 慢 快
app
UdpTest1.javatcp
[java] view plaincopyprint?測試
package com.wansha.net2; spa
import java.net.DatagramPacket; .net
import java.net.DatagramSocket; blog
import java.net.InetAddress; ip
public class UdpTest1 { get
public static void main(String[] args) throws Exception {
DatagramSocket dataSocket = new DatagramSocket();
String str = "hello";
DatagramPacket datapacket = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("localhost"),7000);
dataSocket.send(datapacket);
byte[] by = new byte[4096];
DatagramPacket dataPacket2 = new DatagramPacket(by,4096);
dataSocket.receive(dataPacket2);
String str2 = new String(by,0,dataPacket2.getLength());
System.out.println(str2);
dataSocket.close();
}
}
UdpTest2.java
[java] view plaincopyprint?
package com.wansha.net2;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UdpTest2 {
public static void main(String[] args) throws Exception {
DatagramSocket ds = new DatagramSocket(7000);
byte[] by = new byte[4096];
DatagramPacket dp = new DatagramPacket(by,4096);
ds.receive(dp);
String str = new String(by,0,dp.getLength());
System.out.println(str);
String str2 = "welcome";
DatagramPacket dp2 = new DatagramPacket(str2.getBytes(),str2.length(),dp.getAddress(),dp.getPort());
ds.send(dp2);
ds.close();
}
}