通过Socket实现UDP(用户数据报)编程

  1. 服务器端
    (1)步骤
    ①创建DatagramSocket,指定端口号
    ②创建DatagramPacket
    ③接收客户端发送的数据信息
    ④读取数据
try {
    /**
     * 服务器接收客户端数据
     */
    //1.创建服务器端DatagramSocket,指定端口
    DatagramSocket socket=new DatagramSocket(1028);
    //2.创建数据报,用于接收客户端发送的数据
    byte[] data=new byte[1024];//创建字节数组,指定接收的数据包的大小
    DatagramPacket packet=new DatagramPacket(data, data.length);
    System.out.println("***服务器端已启动,等待客户端***");
    //3.接收客户端发送的数据
    socket.receive(packet);//此方法在接收到数据报之前会一直阻塞
    //4.读取数据
    String info=new String(data);
    System.out.println("我是服务器,客户端说:"+info);
    /**
     * 服务器对客户端数据进行响应
     */
    //1.定义客户端的IP,端口号,数据
    InetAddress address = packet.getAddress();
    int port=packet.getPort();
    byte[] data2="欢迎您".getBytes();
    //2.创建数据报,包含响应的数据信息
    DatagramPacket packet2=new DatagramPacket(data2, 0,data2.length, address, port);
    //3.响应客户端
    socket.send(packet2);
    //4.关闭资源
    socket.close();
} catch (SocketException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

2.客户端
(1)步骤
①定义发送信息
②创建DatagramPacket,包含将要发送的信息
③创建DatagramSocket
④发送数据

try {
    /**
     * 客户端向服务器发送数据
     */
    //1.定义服务器的地址,端口号,数据
    InetAddress address = InetAddress.getByName("localhost");
    int port=1028;
    //2.创建数据报,包含要发送的数据信息
    String info="用户名:admin,密码:123456";
    byte[] bytes=info.getBytes();
    DatagramPacket packet=new DatagramPacket(bytes, 0, bytes.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.读取数据
    System.out.println("我是客户端,服务器说:"+new String(data2));
    //4.关闭资源
    socket.close();
} catch (UnknownHostException e) {
    e.printStackTrace();
} catch (SocketException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}   

3.多客户端
①服务器端

void UDPServer(){
    try {
        /**
         * 服务器接收客户端数据
         */
        //1.创建服务器端DatagramSocket,指定端口
        DatagramSocket socket=new DatagramSocket(1028);
        System.out.println("***服务器端已启动,等待客户端***");
        while(true){
            //2.创建数据包,用于接收客户端发送的数据
            byte[] data=new byte[1024];//创建字节数组,指定接收的数据包的大小
            DatagramPacket packet=new DatagramPacket(data, data.length);
            //3.接收客户端发送的数据
            socket.receive(packet);
            UDPServerThread serverThread=new UDPServerThread(socket,packet);
            serverThread.start();
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
}

②客户端

void UDPClient(){
    try {
        /**
         * 客户端向服务器发送数据
         */
        //1.定义服务器的地址,端口号,数据
        InetAddress address = InetAddress.getByName("localhost");
        int port=1028;
        //2.创建数据报,包含要发送的数据信息
        String info="用户名:admin,密码:123456";
        byte[] bytes=info.getBytes();
        DatagramPacket packet=new DatagramPacket(bytes, 0, bytes.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.读取数据
        System.out.println("我是客户端,服务器说:"+new String(data2));
        //4.关闭资源
        socket.close();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (SocketException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }   
}

③线程监听

public class UDPServerThread extends Thread{
    DatagramSocket socket;
    DatagramPacket packet;
    public UDPServerThread(DatagramSocket socket,DatagramPacket packet) {
        this.socket=socket;
        this.packet=packet;
    }
    @Override
    public void run() {
        try {
            byte[] data=packet.getData();
            //4.读取数据
            String info=new String(data);
            System.out.println("我是服务器,客户端说:"+info);
            /**
             * 服务器对客户端数据进行响应
             */
            //1.定义客户端的IP,端口号,数据
            InetAddress address = packet.getAddress();
            int port=packet.getPort();
            byte[] data2="欢迎您".getBytes();
            //2.创建数据报,包含响应的数据信息
            DatagramPacket packet2=new DatagramPacket(data2, 0,data2.length, address, port);
            //3.响应客户端
            socket.send(packet2);
        } catch (IOException e) {
            e.printStackTrace();
        }   
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值