通过 Socket 实现 UDP 编程 入门

上一篇文章介绍了基于 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