網絡編程的DatagramSocket類和Socket的一些區別

Socket是一種基於TCP的套接字,這種方法的使用每一個鏈接須要花費必定的時間,要減小這種開銷,因而有了第二種套接字:自尋址套接字,它是使用UDP發送尋址信息,不一樣的是他能夠發送多IP信息包。java

      TCP是保證信息到他信息目的,而UDP不會保證,在每個自尋址包中包含了錯誤檢測信息,自尋址包到達目的地以後會對它進行簡單的檢查,若是發現發送錯誤,也不會請求從新發送,直接將其拋棄,因此它是沒有保證的。數組

與Socket類似,客戶端服務端兩邊都是有發送數據和接收數據的通訊。.net

一樣須要先啓動服務端再啓動客戶端指針

1.客戶端封裝代碼code

package lvbowen1;

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

public class Client {
	public static void main(String args[]) {
		String host = "localhost";
		if (args.length == 1)
			host = args[0];
		DatagramPacket dgp1;
		DatagramSocket s = null;
		try {
			s = new DatagramSocket();
			byte[] buffer;// 用來存儲發送的數據
			buffer = new String("hello").getBytes();// 字符串轉化數組
			// 將主機名轉變爲InetAddress類對象,此對象存儲有ip對象和地址
			InetAddress ia = InetAddress.getByName(host);
			// 建立一個DatagramPacket對象來封裝字節數組的指針以及目標地址信息,目標地址包含了ip和端口號
			DatagramPacket dgp = new DatagramPacket(buffer, buffer.length, ia, 10001);
			s.send(dgp);
			byte[] buffer2 = new byte[50];
			// 建立一個對象來封裝返回來的數據
			dgp1 = new DatagramPacket(buffer2, buffer.length, ia, 10001);
			s.receive(dgp1);
			System.out.println("server:" + new String(dgp1.getData()));
		} catch (IOException e) {
			System.out.println(e.toString());
		} finally {
			if (s != null)
				s.close();
		}
	}

}

2.服務端封裝代碼server

package lvbowen1;

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

public class Server {
	public static void main(String args[]) throws IOException {
		System.out.println("Server starting...\n");
		// 在端口號10000上建立套接字,從用戶程序發送包到這個端口
		DatagramSocket s = new DatagramSocket(10001);
		byte[] data = new byte[50];
		DatagramPacket dgp = new DatagramPacket(data, data.length);
		while (true) {
			s.receive(dgp);
			System.out.println("client:" + new String(data));
			s.send(dgp);
		}
	}

}
相關文章
相關標籤/搜索