1. 程式人生 > >Java Socket(套接字)程式設計、TCP和UDP通訊過程詳解

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(連線

)請求;最後,Server端向Client端發回Accept(接受訊息)。一個連線就建立起來了,會話隨即產生。Server端和Client端都可以通過Send、Write等方法與對方通訊。

而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”打印出來。