• 中文
    • 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
  • 1.2k
  • zjmarina

    请登录之后再进行评论

    登录
    单栏布局 侧栏位置: