基於UDP實現簡單的客戶端服務端的消息傳遞


前面的TCP是有可靠的,有序的。現在看看UDP,UDP是不可靠的,無序的。


現在看看實現:
這裏我也用兩個類模擬了客戶端與服務端,

現在直接看下代碼:


UDPServer.java:

package com.socket.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * UDP 服務端
 * 
 * @author lolli
 *
 */
public class UDPServer {
	public static void main(String[] args) {
		try {
			// 創建服務器端的DatagramSocket,並指定端口
			DatagramSocket datagramSocket = new DatagramSocket(8888);
			System.out.println("*****  啓動服務器,等待客戶端的連接請求  ******");
			byte[] data = new byte[2048];
			// 創建數據報,用戶接受客戶端請求的數據
			DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
			// 接收客戶端請求的數據(在接收到數據之前一直處於阻塞狀態)
			datagramSocket.receive(datagramPacket);
			// 獲取請求的數據,並轉成String打印出來
			String clientData = new String(data, 0, datagramPacket.getLength());
			System.out.println("我是服務端,客戶端請求的數據爲:" + clientData);

			
			//  *** 給客戶端進行相應 ***
			
			// 定義客戶端的地址
			InetAddress inetAddress = datagramPacket.getAddress();
			int port = datagramPacket.getPort();
			byte[] backData = "我接受到了客戶端的數據,你好!".getBytes();
			// 創建數據包,給客戶端響應數據
			DatagramPacket backDatagramPacket = new DatagramPacket(backData, backData.length, inetAddress, port);
			// 給客戶端發送數據
			datagramSocket.send(backDatagramPacket);
					
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

再看看客戶端:

UDPClient.java:

package com.socket.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

/**
 * UDP 客戶端
 * @author lolli
 *
 */
public class UDPClient {

	public static void main(String[] args) {
		
		try {
			// 定義服務器地址
			InetAddress inetAddress = InetAddress.getByName("localhost");
			byte[] data = "我是客戶端,hello".getBytes();
			// 創建數據報,準備數據
			DatagramPacket datagramPacket = new DatagramPacket(data, data.length, inetAddress, 8888);
			// 創建一個DatagramSocket
			DatagramSocket datagramSocket = new DatagramSocket();
			// 發送請求
			datagramSocket.send(datagramPacket);
			
			
			// *** 接收服務端響應回來的數據 ***
			
			byte[] resData = new byte[2048];
			// 創建數據報,用戶接受客戶端請求的數據
			DatagramPacket resDatagramPacket = new DatagramPacket(resData, resData.length);
			// 接收客戶端請求的數據(在接收到數據之前一直處於阻塞狀態)
			datagramSocket.receive(resDatagramPacket);
			// 獲取請求的數據,並轉成String打印出來
			String serverData = new String(resData, 0, resDatagramPacket.getLength());
			System.out.println("我是客戶端,服務端響應的數據爲:" + serverData);
			
			
			datagramSocket.close();
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


然後再運行看看結果。

同樣的,我們也要先啓動客戶端,在啓動客戶端

服務端控制檯:


客戶端控制檯:






發佈了53 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章