• 廖雪峰Java13网络编程-1Socket编程-5UDP编程


    1. UDP编程:

    • 不需要建立连接
    • 可以直接发送和接收数据

    1.1 客户端

        DatagramSocket sock = new DatagramSocket(){}
        sock.connect(addr,9090);//并不建立连接
        //接收
        byte[] data=...;
        DatagramPacket packet = new DatagramPacket(data, data.length);
        sock.send(packet);
        //发送
        byte[] buffer = new byte[1024];
        DatagramPacket resp = new DatagramPacket(buffer, buffer.length);
        sock.receive(resp);
        //接收和发送都是通过DatagramPacket实现的
    

    1.2 服务端:

        DatagramSocket ds = new DatagramSocket(9090);
        for( ; ; ){
            //接收
            byte[] buffer = new buffer[1024];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            ds.receive(packet);
            //发送
            byte[] data = ...;
            packet.setData(data);
            ds.send(packet);
        }
    

    1.3 实例

    TCPClient.java

    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.nio.charset.StandardCharsets;
    
    public class UDPClient {
        public static void main(String[] args) throws Exception{
            InetAddress addr = InetAddress.getLoopbackAddress();
            try(DatagramSocket sock = new DatagramSocket()){
                sock.connect(addr,9090);
                byte[] data = "time".getBytes(StandardCharsets.UTF_8);
                DatagramPacket packet = new DatagramPacket(data,data.length);
                sock.send(packet);
                System.out.println("Data was sent");
                Thread.sleep(1000);
                byte[] buffer = new byte[1024];
                DatagramPacket resp = new DatagramPacket(buffer,buffer.length);
                sock.receive(resp);
                byte[] respData = resp.getData();
                String respText = new String(respData,0,resp.getLength());
                System.out.println("Response:"+respText);
            }
        }
    }
    
    

    TCPServer.java

    package com.crazy;
    
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.nio.charset.StandardCharsets;
    import java.time.LocalDateTime;
    
    public class UDPServer {
        public LocalDateTime currentTime(){
            return LocalDateTime.now();
        }
        public static void main(String[] args) throws Exception{
            DatagramSocket ds = new DatagramSocket(9090);
            System.out.println("UDP server ready");
            for(;;){
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
                ds.receive(packet);
                byte[] data = packet.getData();
                String s = new String(data, StandardCharsets.UTF_8);
                System.out.println("Pack received from : "+packet.getSocketAddress());
                String resp = LocalDateTime.now().toString();
                packet.setData(resp.getBytes(StandardCharsets.UTF_8));
                ds.send(packet);
            }
        }
    }
    

    先运行server

    再运行client

    2. 总结:

    UDP编程模型:

    • 客户端使用DatagramSocket.connect()指定远程地址和端口
    • 服务器端用DatagramSocket(port)监听端口
    • 双方通过receive/send读写数据
    • 没有IO流接口
  • 相关阅读:
    Java 对象初始化
    Java 栈和堆
    值得细品
    磁盘的分区、格式化与挂载
    VirtualBox预存空间不足
    做个备忘
    SQL查数据库有哪些触发器,存储过程...
    SQL 中 CASE
    FMX的Style中的Effects的注意问题
    Python图像处理库(2)
  • 原文地址:https://www.cnblogs.com/csj2018/p/11146148.html
Copyright © 2020-2023  润新知