Java Socket(套接字)程式設計、TCP和UDP通訊過程詳解
網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個雙向鏈路的一端被稱為一個Socket。Socket也被稱為套接字,可以用來實現不同虛擬機器或不同計算機之間的通訊。在Java語言中,Socket可以分為兩種型別,面向連線的Socket通訊協議(TCP,Transmission Control Protocol,傳輸控制協議)和麵向無連線的Socket通訊協議(UDP,User Datagram Protocol,使用者資料報協議)。任何一個Socket都是由IP地址和埠號唯一確定的,如下圖所示:
基於TCP的通訊過程如下:首先,Server(伺服器)端Listen(監聽)指定的某個埠(建議使用大於1024的埠)是否有連線請求;其次,Client(客戶)端向Server端發出Connect(連線
而UDP提供了無連線通訊,且不對傳送資料包進行可靠性保證,適合於一次傳輸少量資料,UDP傳輸的可靠性由應用層負責。UDP報文沒有可靠性保證、順序保證和流量控制欄位等,可靠性較差。但是正因為UDP協議的控制選項較少,在資料傳輸過程中延遲小、資料傳輸效率高,適合對可靠性要求不高的應用程式,或者可以保障可靠性的應用程式,如DNS、TFTP、SNMP等。
Socket的生命週期可以分為3個階段:開啟Socket、使用Socket收發資料和關閉Socket。在Java語言中,可以使用ServerSocket來作為伺服器端,Socket來作為客戶端來實現網路通訊。
問題描述:用Socket實現客戶端與伺服器端的通訊,要求客戶傳送資料後能夠回顯相同的資料。
參考答案:首先,建立一個名為Server.java的伺服器端程式碼,如下所示:
package com.js.socketDemo; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 伺服器類 * @author JiangShuai * */ public class Server { public static void main(String[] args){ BufferedReader br = null; PrintWriter pw = null; try{ ServerSocket server = new ServerSocket(2000); Socket socket = server.accept(); //獲取輸入流 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //獲取輸出流 pw = new PrintWriter(socket.getOutputStream(),true); String s = br.readLine(); pw.println(s); }catch(Exception e){ e.printStackTrace(); }finally{ try{ br.close(); pw.close(); }catch(Exception e){ } } } }
其次,再建立一個Client.java的客戶端程式,如下所示:
package com.js.socketDemo;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* 客戶端類
* @author JiangShuai
*
*/
public class Client {
public static void main(String[] args) {
BufferedReader br = null;
PrintWriter pw = null;
try {
Socket socket = new Socket("localhost",2000);
//獲取輸入流、輸出流
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(),true);
//向伺服器傳送資料
pw.println("Hello");
String s = null;
while(true){
s = br.readLine();
if(s!=null)
break;
}
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}finally{
try {
br.close();
pw.close();
} catch (Exception e2) {
}
}
}
}
最後啟動伺服器端程式,然後執行客戶端程式,客戶端將會把從伺服器端轉發過來的“Hello”打印出來。