黑馬程式設計師:Socket程式設計之(UDP vs TCP)
----------------------
ASP.Net+Unity開發、 .Net培訓、期待與您交流! ----------------------
UDP和TCP都是傳輸協議,裝置之間遵循通訊協議完成網路連線,實現資料傳輸。
TCP是一種基於連線的網路通訊協議,TCP連線兩端分別為客戶端和服務端,對應的類分別為Socket(客戶端)和ServerSocket(伺服器)。一旦有客戶端,就必須有相應的伺服器端與之對應,否則,將實現不了網路連線;
而UDP不一樣,UDP是基於無連線的,UDP連線兩端分別為,傳送方和接收方,假設有一個傳送端,不管有沒有接收端,他都可以傳送傳送資料。但因為沒有接收端接收,會造成資料丟失資料。相比UDP,TCP能確保資料的正確性。UDP連線對應的類是DatagramSocket,使用該類建立一個網路應用程式,並繫結一個埠,可使用者自行制定,也可不指定,此時將有系統隨機分配。但是在建立接收端應用程式時,最好繫結指定的埠號。否則,傳送端將不知道把資料發往哪裡。
UDP裝置之間數通過資料包(DatagramPacket)進行資料傳輸。傳送端首先將要傳送的資料打包,即封裝到DatagramPacket物件中,然後使用DatagramSocket物件的send()方法,將資料包發給接收端。接收端使用DatagramSocket的receive方法獲取資料包。簡單地說,就是一個打包和拆包的過程。
TCP裝置間,構造一個通路,使用資料流進行資料傳輸。客戶端和伺服器建立連線後,通過客戶端物件(Socket)的輸入流和輸出流進行資料傳輸。也可以說,伺服器端是沒有建立流物件。它是通過ServerSocket類提供的accept方法,來獲取客戶端物件(Socket),然後使用客戶端物件再獲取流物件。所以說,服務端和客戶端都是用客戶端的流物件進行資料傳輸。通過Socket類提供的getInputStream()方法來獲取輸入流(InputStream),再使用InputStream的read()方法,讀取資料。通過Socket類提供的getOutputStream()方法獲取輸出流(OutputStream),再使用OutputStream的write方法傳送資料。
下面是給出了TCP連線的例子:
//客戶端
class TcpClient{
public static void main(String[] args)
{
try{
//首先建立客戶端服務,並讓這個客戶端連線到主機“192.168.1.107”,埠號為10004應用程式上。
Socket s = new Socket("192.168.1.107",10004);
//獲取客戶端的輸入流,讀取資料。
InputStream in = s.getInputStream();
//獲取客戶端的輸出流,輸出資料。
OutputStream out = s.getOutputStream();
//向伺服器傳送資料
out.write("服務端,我是客戶端!!!".getBytes());
//獲取伺服器的反饋,首先定義一個緩衝區
byte[] buf = new byte[1024];
int len = in.read(buf);//讀取資料,並將資料存入緩衝區buf中
//將獲取到的資料,轉換為字元轉列印到控制檯
String data = new String(buf,0,len);
System.out.println(data);
//關閉客戶端程式
s.close();
}catch(Exception e){
throw new RuntimeException("連線伺服器失敗");
}
}
}
//服務端(服務端的ip為192.168.1.107)
public static void main(String[] args) throws Exception
{
//首先建立伺服器,繫結埠。
ServerSocket ss = new ServerSocket(10004);
//獲取客戶端物件
Socket s = ss.accept();
//獲取客戶端的輸入流,得到客戶端傳送過來資料
InputStream in = s.getInputStream();
//獲取客戶端的輸出流,用於向客戶端傳送訊息
OutputStream out = s.getOutputStream();
//讀取客戶端傳送過來的資料
byte [] buf = new byte[1024];
int len = in.read(buf);
String ip = s.getInetAddress().getHostAddress();
String data = new String(buf,0,len);
//將客戶端傳送過來的資料列印到控制檯
System.out.println(ip + "...:" + data);
//獲取客戶端資訊後,給客戶端反饋
out.write("客戶端,你好,你的訊息已收到!".getBytes());
}
}
---------------------- ASP.Net+Unity開發、 .Net培訓、期待與您交流! ----------------------