• 中文
    • English
  • 注册
  • 查看作者
    • 3:Socket:基于UDP的Socket通信

      一.  DatagramPacket

      《Socket:基于TCP的Socket通信以及使用多线程实现多客户端的通信》一文中,我们讲解了如何基于TCP协议进行socket编程,接下来讲解基于UDP的socket编程。

      UDP协议(用户数据报协议)是无连接、不可靠的、无序的,以数据报作为数据传输的载体,速度较快。

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

      • DatagramPacket:表示数据报包

      • DatagramSocket:进行端到端通信的类

      二.  基于UDP的Socket通信服务器端

      想要基于UDP进行Socket通信,服务端需要做的事情大概有以下几步

      • 创建DatagramSocket,指定端口号

      • 创建DatagramPacket

      • 接收客户端发送的数据信息

      • 读取数据

      上面的步骤所对应的代码:

      package com.example.sockettest.server;
      
      import com.example.thread.ServerThread;
      
      import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      /**
       * @Author : ZhangJia
       * @Date : 13:55
       * @Description : 
       */
      public class Server {
          public static void main(String[] args) {
              //1.创建ServerSocket对象,绑定监听端口
              try {
                  ServerSocket serverSocket = new ServerSocket(8887);
                  int count = 0; //记录客户端的数量
                  System.out.println("服务器即将启动,等待客户端连接");
                  Socket socket = null;
                  //循环监听等待客户端的连接
                  while (true) {
                      // 通过accept()方法监听客户端请求
                      socket = serverSocket.accept();
                      // 创建一个新的线程
                      ServerThread serverThread = new ServerThread(socket);
                      // 启动线程
                      serverThread.start();
                      System.out.println("当前客户端的数量是" + ++count);
                      System.out.println("当前客户端计算机名" + socket.getInetAddress().getHostName());
                      System.out.println("当前客户端IP" + socket.getInetAddress().getHostAddress());
                      System.out.println("-------------------");
                  }
              } catch (IOException e) {
                  e.printStackTrace();
              }
      
          }
      }

      接下来启动服务器端,服务器端的控制台输出:

      服务器即将启动,等待客户端连接

      三.  基于UDP的Socket通信客户端

      想要基于UDP进行Socket通信,客户端需要做的事情大概有以下几步

      • 定义发送信息

      • 创建DatagramPacket,包含将要发送的信息

      • 创建DatagramSocket

      • 发送数据

      上面的步骤所对应的代码:

      package com.example.sockettest.client;
      
      import java.net.DatagramPacket;
      import java.net.DatagramSocket;
      import java.net.InetAddress;
      import java.net.UnknownHostException;
      
      /**
       * @Author : ZhangJia
       * @Date : 16:27
       * @Description : 
       */
      public class UDPClient {
          public static void main(String[] args) {
      
              try {
                  /*
                   * 发送数据给服务器端
                   *
                   * */
                  //1. 定义服务器的地址、端口号、数据
                  InetAddress address = InetAddress.getByName("localhost");
                  int port = 8887;
                  byte[] data = "你好,我是ZhangJia".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 info = new String(data2,0,packet2.getLength());
                  System.out.println("我是客户器端,服务器端发送的消息是:" + info);
                  //4. 关闭资源
                  socket.close();
              } catch (Exception e) {
                  e.printStackTrace();
              }
          }
      }

      接下来启动客户端,服务器端的控制台输出(注意,此时第二节启动的服务器端还没有关闭):

      服务器即将启动,等待客户端连接
      我是服务器,客户端发送的消息是你好,我是ZhangJia

      而客户端的控制台输出:

      我是客户器端,服务器端发送的消息是:我已经收到您发送的数据

      参考资料

      本文所有内容根据慕课网汤小洋老师:Java Socket应用—通信是这样练成的 教程整理而成

      山东省·日照市
    • 0
    • 0
    • 0
    • 1k
    • zjmarina

      请登录之后再进行评论

      登录

      赞助本站

      • 支付宝
      • 微信
      • QQ

      感谢一直支持本站的所有人!

      单栏布局 侧栏位置: