通过 Socket 实现 UDP 编程 入门

avatar 2017年12月04日22:59:12 5 2621 views
博主分享免费Java教学视频,B站账号:Java刘哥 ,长期提供技术问题解决、项目定制:本站商品点此
上一篇文章介绍了基于 TCP 协议的 Socket 通信,本文介绍基于 UDP 协议的 Socket 通信,还是一个用户登录的例子。



UDP协议(用户数据报协议)是无连接、不可靠、无序的。

UDP协议以数据报作为数据传输载体。



进行数据传输时,首先要将要传输的数据定义成数据报(Datagram),在数据报中指明所要达到的 Socket(主机地址和端口),然后再将数据报发送出去。

相关操作类:

DatagramPacket:表示数据报包

DatagramSocket:进行端到端通信的类


DatagramPacket 构造器和成员方法


1、Datagram 构造方法





2、DatagramPacket 成员方法




DatagramSocket 构造器和成员方法


1、DatagramSocket 构造器





2、DatagramSocket 成员方法








一个服务端和支持多个客户端的对话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 类





2、再运行 Client 类

服务器端界面





客户端界面





3、再启动一个 Client 类

服务器端界面







本文参考慕课网

本文地址:https://liuyanzhao.com/6924.html
  • 微信
  • 交流学习,资料分享
  • weinxin
  • 个人淘宝
  • 店铺名:言曌博客咨询部

  • (部分商品未及时上架淘宝)
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0