java UDP報文的發送與接收

import java.io.File;
import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/**--------文件名:UDPServer.java-------------*/
public class UDPServer {
	public static void main(String args[]) {
		try {
			System.out.println("UDP服務端啓動成功,等待接收消息...");
			if (args.length != 1) {
				throw new IllegalArgumentException("參數個數有誤");
			}
			int port = Integer.parseInt(args[0]); 	// 從命令行中獲取端口號參數
			// 創建一個socket,偵聽這個端口。
			DatagramSocket dsocket = new DatagramSocket(port);
			byte[] buffer = new byte[2048]; 		// 保存接收到的UDP報文的字節數組
			// 創建一個DatagramPacket,將收到的報文寫入buffer中。
			// 注意,這裏指定了報文的長度,如果收到的UDP報文比2048大,
			// 多餘的信息被捨棄
			DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
			// 不斷循環,接收數據
			while (true) {
				dsocket.receive(packet); // 等待收到一個數據包
				// 將收到的報文的字節數組封裝成字符串。
				String msg = new String(buffer, 0, packet.getLength());
				// 從數據包中取得消息來源的地址
				System.out.println("Receive: "
						+ packet.getAddress().getHostAddress() + ": " + msg);
				// 如果收到QUIT指令,則退出循環。
				if (msg.equalsIgnoreCase("QUIT")) {
					System.out.println("退出UDP服務");
					break;
				}
				packet.setLength(buffer.length); // 重設數據包的長度
			}
			// 關閉socket
			dsocket.close();
		} catch (Exception e) {
			System.err.println(e);
			// System.err.println(usage);
		}
	}
}
/**--------文件名:UDPClient.java-------------*/
class UDPClient {
	public static void main(String args[]) {
		try {
			// 檢查參數個數
			if (args.length < 3) {
				throw new IllegalArgumentException("參數個數有誤");
			}
			// 域名和端口
			String host = args[0];
			int port = Integer.parseInt(args[1]);
			// 下面構造待發送報文的字節數組
			byte[] message;
			if (args[2].equals("-f")) {
				// 如果第三個參數爲 -f,則表示將文件的內容以UDP方式發送
				// 獲得待發送的文件對象以及文件的長度
				File f = new File(args[3]);
				int len = (int) f.length();
				// 創建一個足夠容納文件內容的字節數組
				message = new byte[len];
				FileInputStream in = new FileInputStream(f);
				// 將文件內容以字節的方式讀到字節數組中
				int bytes_read = 0, n;
				do {
					n = in.read(message, bytes_read, len - bytes_read);
					bytes_read += n;
				} while ((bytes_read < len) && (n != -1));
			} else {
				// 如果第三個參數不是 -f,則將後面的參數當作消息發送
				String msg = args[2];
				for (int i = 3; i < args.length; i++) {
					msg += " " + args[i];
				}
				message = msg.getBytes();
			}
			// 根據域名獲取IP地址
			InetAddress address = InetAddress.getByName(host);
			// 初始化一個UDP包。
			// DatagramPacket的構造方法中必須使用InetAddress,而不能是IP地址或者域名
			DatagramPacket packet = new DatagramPacket(message, message.length,
					address, port);
			// 創建一個DatagramSocket,以發送UDP包
			DatagramSocket dsocket = new DatagramSocket();
			dsocket.send(packet);
			System.out.println("send: " + new String(message));
			dsocket.close();
			// 注意:如果在構造DatagramPacket時,不提供IP地址和端口號,
			// 則需要調用DatagramSocket的connect方法,否則無法發送UDP包
			packet = new DatagramPacket(message, message.length);
			dsocket = new DatagramSocket();
			dsocket.connect(address, port);
			dsocket.send(packet);
			System.out.println("Send: " + new String(message));
			dsocket.close();
		} catch (Exception e) {
			System.err.println(e);
		}
	}
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章