上一篇文章介紹了基於 TCP 協議的 Socket 通訊,本文介紹基於 UDP 協議的 Socket 通訊,還是一個使用者登入的例子。
UDP協議(使用者資料包協議)是無連線、不可靠、無序的。
UDP協議以資料包作為資料傳輸載體。
進行資料傳輸時,首先要將要傳輸的資料定義成資料包(Datagram),在資料包中指明所要達到的 Socket(主機地址和埠),然後再將資料包傳送出去。
相關操作類:
DatagramPacket:表示資料包包
DatagramSocket:進行端到端通訊的類
DatagramPacket 構造器和成員方法
1、Datagram 構造方法
2、DatagramPacket 成員方法
DatagramSocket 構造器和成員方法
1、DatagramSocket 構造器
2、DatagramSocket 成員方法
一個服務端和支援多個客戶端的對話demo
1、Server.java
- package com.liuyanzhao.udp;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- /**
- * @author 言曌
- * @date 2017/12/4 下午9:38
- */
- public class Server {
- public static void main(String[] args) throws IOException {
- DatagramSocket socket = new DatagramSocket(8888);
- byte[] data = new byte[1024];
- DatagramPacket packet;
- packet = new DatagramPacket(data, data.length);
- System.out.println("伺服器已啟動");
- while (true){
- socket.receive(packet);//在接收到資料包之前一直阻塞
- ServerThread thread = new ServerThread(socket, packet);
- thread.run();
- }
- }
- }
2、ServerThread.java
- package com.liuyanzhao.udp;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- /**
- * @author 言曌
- * @date 2017/12/4 下午10:24
- */
- public class ServerThread implements Runnable {
- private DatagramSocket socket;
- private DatagramPacket packet;
- public ServerThread(DatagramSocket socket, DatagramPacket packet) {
- this.socket = socket;
- this.packet = packet;
- }
- @Override
- public void run() {
- byte[] data = packet.getData();
- String info = new String (data, 0, packet.getLength());
- System.out.println("我是伺服器,客戶端說:" + info);
- InetAddress address = packet.getAddress();
- int port = packet.getPort();
- byte[] data2 = "歡迎您!".getBytes();
- DatagramPacket reply = new DatagramPacket(data2, data2.length, address, port);
- try {
- socket.send(reply);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
3、Client.java
- package com.liuyanzhao.udp;
- import java.io.IOException;
- import java.net.DatagramPacket;
- import java.net.DatagramSocket;
- import java.net.InetAddress;
- /**
- * 客戶端
- * @author 言曌
- * @date 2017/12/4 下午9:44
- */
- public class Client {
- public static void main(String args[]) throws IOException {
- //1、定義伺服器的地址、埠號、資料
- InetAddress address = InetAddress.getByName("localhost");
- int port = 8888;
- byte[] data = "使用者名稱:admin;密碼:123456".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();
- }
- }
執行效果
1、先執行 Server 類
2、再執行 Client 類
伺服器端介面
客戶端介面
3、再啟動一個 Client 類
伺服器端介面
本文參考慕課網