socket(三)–udp同步阻塞式

socket(三)–udp同步阻塞式

一、简介

udp是无状态的,不需要事先建立连接,发送报文也是不安全的,即不保证一定发送到,也不保证按顺序送到。同时因为无连接,相应的开销小,速度快,可用于视频、语音等对实时性要求高,数据完整性要求不高的场景。这里对在java中阻塞式的udp通信进行介绍。

二、关键类

2.1、java.net.DatagramSocket

客户端和服务端都使用的socket,通常服务端需要指定端口,客户端可由机器自动分配。

2.2 java.net.DatagramPacket

报文,发送报文需要指定发送的目的地。接收时不需要指定地址。

三、示例

3.1 服务端代码

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;

public class UdpServer {
    public static void main(String[] args) throws Exception {
        //生成服务端datagram socket, 绑定端口
        DatagramSocket socket = new DatagramSocket(6001);
        Scanner scanner = new Scanner(System.in);
        while (true) {
            //接收消息
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
            socket.receive(packet);
            String msg = new String(packet.getData(), 0, packet.getLength());
            System.out.println("receive msg:" + msg);

            //发送消息,发送地址来自接收报文
            System.out.print("send msg:");
            String writeMsg = scanner.nextLine();
            packet.setData(writeMsg.getBytes());
            socket.send(packet);
        }
    }
}

3.2 客户端代码

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.util.Scanner;

public class UdpClient {
    public static void main(String[] args) throws Exception {
        //生成客户端datagram socket,端口自定义
        DatagramSocket socket = new DatagramSocket();
        //指定发送目的地
        InetSocketAddress address = new InetSocketAddress("127.0.0.1", 6001);

        Scanner scanner = new Scanner(System.in);
        while (true) {
            //发送消息
            System.out.print("send msg:");
            String msg = scanner.nextLine();
            byte[] writeBytes = msg.getBytes();
            //报文中指定发送地址
            DatagramPacket writePacket = new DatagramPacket(writeBytes, writeBytes.length, address);
            socket.send(writePacket);

            //接收消息
            byte[] readbytes = new byte[1024];
            DatagramPacket readPacket = new DatagramPacket(readbytes,readbytes.length);
            socket.receive(readPacket);
            String readMsg = new String(readPacket.getData(), 0, readPacket.getLength());
            System.out.println("receive msg:" + readMsg);
        }
    }
}
发布了274 篇原创文章 · 获赞 95 · 访问量 50万+

猜你喜欢

转载自blog.csdn.net/chinabestchina/article/details/105037316