通過 Socket 實現 UDP 程式設計 入門

言曌發表於2018-03-17

上一篇文章介紹了基於 TCP 協議的 Socket 通訊,本文介紹基於 UDP 協議的 Socket 通訊,還是一個使用者登入的例子。

 

UDP協議(使用者資料包協議)是無連線、不可靠、無序的。

UDP協議以資料包作為資料傳輸載體。

 

進行資料傳輸時,首先要將要傳輸的資料定義成資料包(Datagram),在資料包中指明所要達到的 Socket(主機地址和埠),然後再將資料包傳送出去。

相關操作類:

DatagramPacket:表示資料包包

DatagramSocket:進行端到端通訊的類

 

DatagramPacket 構造器和成員方法

1、Datagram 構造方法

通過 Socket 實現 UDP 程式設計 入門

 

2、DatagramPacket 成員方法

通過 Socket 實現 UDP 程式設計 入門

 

DatagramSocket 構造器和成員方法

1、DatagramSocket 構造器

通過 Socket 實現 UDP 程式設計 入門

 

2、DatagramSocket 成員方法

通過 Socket 實現 UDP 程式設計 入門

通過 Socket 實現 UDP 程式設計 入門

 

 

一個服務端和支援多個客戶端的對話demo

1、Server.java

  1. package com.liuyanzhao.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. /**
  7.  * @author 言曌
  8.  * @date 2017/12/4 下午9:38
  9.  */
  10. public class Server {
  11.     public static void main(String[] args) throws IOException {
  12.         DatagramSocket socket = new DatagramSocket(8888);
  13.         byte[] data = new byte[1024];
  14.         DatagramPacket packet;
  15.         packet = new DatagramPacket(data, data.length);
  16.         System.out.println("伺服器已啟動");
  17.         while (true){
  18.             socket.receive(packet);//在接收到資料包之前一直阻塞
  19.             ServerThread thread = new ServerThread(socket, packet);
  20.             thread.run();
  21.         }
  22.     }
  23. }

 

2、ServerThread.java

  1. package com.liuyanzhao.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. /**
  7.  * @author 言曌
  8.  * @date 2017/12/4 下午10:24
  9.  */
  10. public class ServerThread implements Runnable {
  11.     private DatagramSocket socket;
  12.     private DatagramPacket packet;
  13.     public ServerThread(DatagramSocket socket, DatagramPacket packet) {
  14.         this.socket = socket;
  15.         this.packet = packet;
  16.     }
  17.     @Override
  18.     public void run() {
  19.         byte[] data = packet.getData();
  20.         String info = new String (data, 0, packet.getLength());
  21.         System.out.println("我是伺服器,客戶端說:" + info);
  22.         InetAddress address = packet.getAddress();
  23.         int port = packet.getPort();
  24.         byte[] data2 = "歡迎您!".getBytes();
  25.         DatagramPacket reply = new DatagramPacket(data2, data2.length, address, port);
  26.         try {
  27.             socket.send(reply);
  28.         } catch (IOException e) {
  29.             e.printStackTrace();
  30.         }
  31.     }
  32. }

 

3、Client.java

  1. package com.liuyanzhao.udp;
  2. import java.io.IOException;
  3. import java.net.DatagramPacket;
  4. import java.net.DatagramSocket;
  5. import java.net.InetAddress;
  6. /**
  7.  * 客戶端
  8.  * @author 言曌
  9.  * @date 2017/12/4 下午9:44
  10.  */
  11. public class Client {
  12.     public static void main(String args[]) throws IOException {
  13.         //1、定義伺服器的地址、埠號、資料
  14.         InetAddress address = InetAddress.getByName("localhost");
  15.         int port = 8888;
  16.         byte[] data = "使用者名稱:admin;密碼:123456".getBytes();
  17.         //2、建立資料包
  18.         DatagramPacket packet = new DatagramPacket(data,data.length,address,port);
  19.         //3、建立DatagramSocket物件
  20.         DatagramSocket socket = new DatagramSocket();
  21.         //4、向伺服器端傳送資料
  22.         socket.send(packet);
  23.         /**
  24.          * 接受伺服器端的響應的資料
  25.          */
  26.         //1、建立資料包,用於接受伺服器響應的資料
  27.         byte[] data2 = new byte[1024];
  28.         DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
  29.         //2、接受伺服器響應的資料
  30.         socket.receive(packet2);
  31.         //3、讀取伺服器端響應的資料
  32.         String reply = new String(data2,0,packet2.getLength());
  33.         System.out.println("我是客戶端,伺服器說:"+reply);
  34.         //4、關閉資源
  35.         socket.close();
  36.     }
  37. }

 

執行效果

1、先執行 Server 類

通過 Socket 實現 UDP 程式設計 入門

 

2、再執行 Client 類

伺服器端介面

通過 Socket 實現 UDP 程式設計 入門

 

客戶端介面

通過 Socket 實現 UDP 程式設計 入門

 

3、再啟動一個 Client 類

伺服器端介面

通過 Socket 實現 UDP 程式設計 入門

 

 

本文參考慕課網

本文地址:https://liuyanzhao.com/6924.html

相關文章