zoukankan      html  css  js  c++  java
  • UDP编程

    概述

    UDP(User Datagram Protocol)用户数据报协议

    为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。

    模型图片

    img

    使用方法

    客户端

    1. 建立 DatagramSocket 连接
    2. 建立 DatagramPacket 数据包
    3. 发送数据包
    4. 关闭连接

    服务端

    1. 设置端口
    2. 建立需要被接收数据包
    3. 接收数据包
    4. 关闭连接

    常用api

    优化

    。。。

    实例

    客户端

    /**
     * @function UDP发送消息,无需接收
     */
    public class UdpClientDemo01 {
        public static void main(String[] args) throws Exception {
    //        设置ip、端口
            InetAddress ip = InetAddress.getByName("localhost");
            int port = 9090;
    //        发送的消息
            String msg = "你好 钢镚核恒!";
    //        建立socket连接
            DatagramSocket datagramSocket = new DatagramSocket();
    //        建立数据包
            DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0,msg.getBytes().length, ip,port);
    //        发送数据包
            datagramSocket.send(datagramPacket);
    //        关闭连接
            datagramSocket.close();
        }
    }
    

    服务端

    public class UdpServerDemo01 {
        public static void main(String[] args) throws IOException {
    //        设置端口
            DatagramSocket datagramSocket = new DatagramSocket(9090);
    //        建立缓冲区
            byte[] buffer = new byte[1024];
    //        建立需要被接收数据包
            DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
    //        接收数据包、阻塞
            datagramSocket.receive(datagramPacket);
    //        输出ip、消息
            System.out.println(datagramPacket.getAddress().getHostAddress());
            System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
    //        关闭连接
            datagramSocket.close();
        }
    }
    

    实现简单的聊天

    客户端

    /**
     * 实现简单的聊天,一端发送,一端接收
     */
    public class UdpClient {
        public static void main(String[] args) throws IOException {
            DatagramSocket datagramSocket = new DatagramSocket(9090);
            while (true){
                //接收控制台数据
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
    //            读取一行
                String data = bufferedReader.readLine();
    //            缓冲区
                byte[] datas = data.getBytes();
    //            建立数据包
                DatagramPacket datagramPacket = new DatagramPacket(datas, 0,datas.length, new InetSocketAddress("localhost",9091));
                datagramSocket.send(datagramPacket);
                if(data.equals("bye")){
                    break;
                }
            }
            datagramSocket.close();
        }
    }
    

    服务端

    public class UdpServer {
        public static void main(String[] args) throws IOException {
            DatagramSocket datagramSocket = new DatagramSocket(9091);
            while (true){
    //            准备接收收据包
                byte[] buffer = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(buffer, 0, buffer.length);
                datagramSocket.receive(datagramPacket);
    //            输出数据
                byte[] data = datagramPacket.getData();
                String receiveData = new String(data, 0, data.length);
                System.out.println(receiveData);
                if(receiveData.equals("bye")){
                    break;
                }
            }
            datagramSocket.close();
        }
    }
    
  • 相关阅读:
    Java并发基础10:原子性操作类的使用
    Java并发基础09. 多个线程间共享数据问题
    Java并发基础08. 造成HashMap非线程安全的原因
    Java并发基础07. ThreadLocal类以及应用技巧
    Java并发基础06. 线程范围内共享数据
    Java并发基础05. 传统线程同步通信技术
    Java并发基础04. 线程技术之死锁问题
    我是如何从通信转到Java软件开发工程师的?
    IOS 判断耳机插入/拔出
    海量数据处理
  • 原文地址:https://www.cnblogs.com/gbhh/p/13768062.html
Copyright © 2011-2022 走看看