基於UDP協定的Socket通信
本節引言:
本節帶給大家Socket的最後一節:基於UDP協定的Socket通信,在第一節我們已經詳細地 比較了兩者的差異,TCP和UDP最大的差異在於是否需要客戶端與服務端建立連線後才能進行 資料傳輸,如果你學了前兩節TCP的,傳輸前先開服務端,accept,等客戶端接入,然後獲得 客戶端socket接著進行IO操作,而UDP則不用,UDP以資料封包作為資料的傳輸載體,在進行傳輸時 首先要把傳輸的資料定義成資料報(Datagram),在資料報中指明資料要到達的Socket(主機位址 和連接埠號碼),然後再將資料以資料封包的形式發送出去,然後就沒有然後了,服務端收不收到我就 不知道了,除非服務端收到後又回我一段確認的資料報~時間關係就不另外寫Android範例了 直接上Java程式碼~
1.服務端實作步驟:
#Step 1:建立DatagramSocket,指定連接埠號碼
Step 2:建立DatagramPacket
Step 3:接收客戶端所傳送的資料資訊
##Step 4:讀取資料
#範例程式碼:
public class UPDServer { public static void main(String[] args) throws IOException { /* * 接收客户端发送的数据 */ // 1.创建服务器端DatagramSocket,指定端口 DatagramSocket socket = new DatagramSocket(12345); // 2.创建数据报,用于接收客户端发送的数据 byte[] data = new byte[1024];// 创建字节数组,指定接收的数据包的大小 DatagramPacket packet = new DatagramPacket(data, data.length); // 3.接收客户端发送的数据 System.out.println("****服务器端已经启动,等待客户端发送数据"); socket.receive(packet);// 此方法在接收到数据报之前会一直阻塞 // 4.读取数据 String info = new String(data, 0, packet.getLength()); System.out.println("我是服务器,客户端说:" + info); /* * 向客户端响应数据 */ // 1.定义客户端的地址、端口号、数据 InetAddress address = packet.getAddress(); int port = packet.getPort(); byte[] data2 = "欢迎您!".getBytes(); // 2.创建数据报,包含响应的数据信息 DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port); // 3.响应客户端 socket.send(packet2); // 4.关闭资源 socket.close(); } }
2.客戶端實作步驟:
本節小結:本節內容比較簡單,無非就是將資料轉換為位元組,然後放到Step 1:定義傳送訊息
Step 2:建立DatagramPacket,包含將要傳送的訊息
Step 3:建立DatagramSocket
Step 4:傳送數據public class UDPClient { public static void main(String[] args) throws IOException { /* * 向服务器端发送数据 */ // 1.定义服务器的地址、端口号、数据 InetAddress address = InetAddress.getByName("localhost"); int port = 8800; byte[] data = "用户名:admin;密码:123".getBytes(); // 2.创建数据报,包含发送的数据信息 DatagramPacket packet = new DatagramPacket(data, data.length, address, port); // 3.创建DatagramSocket对象 DatagramSocket socket = new DatagramSocket(); // 4.向服务器端发送数据报 socket.send(packet); /* * 接收服务器端响应的数据 */ // 1.创建数据报,用于接收服务器端响应的数据 byte[] data2 = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(data2, data2.length); // 2.接收服务器响应的数据 socket.receive(packet2); // 3.读取数据 String reply = new String(data2, 0, packet2.getLength()); System.out.println("我是客户端,服务器说:" + reply); // 4.关闭资源 socket.close(); } }
DatagramPacket(資料封包中),發送的 時候帶上接受者的IP位址和連接埠號,而接收時,用一個位元組數組來快取!發送的時候需要建立一個DatagramSocket(端對端通訊的類別)對象,然後呼叫send方法給接受者傳送資料封包~ 本節程式碼來自慕客網路上的一個JavaSocket教學~有興趣的可以看看:Java Socket應用程式---通訊是這樣練成的