JAVA网络编程(3)UDP编程

3.1 需求描述

需求:在线咨询功能,客户和客服在线交流

分析:1、基于UDP协议的Socket网络编程

​ 2、不需要利用IO流实现数据传输

​ 3、每个数据发送单元被统一封装成数据包的方式,发送方将数据包发送到网络中,数据包在网络中去寻找它的目的地。

UDP基本概念:

  • DatagramSocket:用于发送或接收数据包
  • DatagramPacket:数据包

3.2 一次单向通信

//服务器端编码
public class AskServer {

    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket,指定接收数据的端口
        DatagramSocket socket = new DatagramSocket(8088);
        //2.接收数据包
        byte[] buf = new byte[1024]; //接收数据包的大小
        int length = buf.length;
        DatagramPacket packet = new DatagramPacket(buf,length);
        socket.receive(packet);
        System.out.println(packet.getAddress());
        System.out.println(packet.getPort());
        String msg = new String(packet.getData(),"utf-8");
        System.out.println("客户端发送的数据:" + msg);
        //3.关闭资源
        socket.close();
    }

}
//客户端编码
public class AskClient {

    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket,可以指明接收数据的端口,不指明会自动分配
        DatagramSocket socket = new DatagramSocket(9000);
        //2.发送数据包
        String message = "亲,在吗?";
        byte[] buf = message.getBytes();
        int length = buf.length;
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        DatagramPacket packet = new DatagramPacket(buf,length,ip,8088);
        socket.send(packet);
        //3.关闭资源
        socket.close();
    }

}

3.3 一次双向通信

//服务器端编码实现
public class AskServer {

    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket,指定接收数据的端口
        DatagramSocket socket = new DatagramSocket(8088);
        //2.接收数据包
        byte[] buf = new byte[1024]; //接收数据包的大小
        int length = buf.length;
        DatagramPacket packet = new DatagramPacket(buf,length);
        socket.receive(packet);
        String msg = new String(packet.getData(),"utf-8");
        System.out.println("客户端发送的数据:" + msg);
        //发送数据给客户端
        String s = "在的,亲!";
        packet.setData(s.getBytes());
        packet.setLength(s.getBytes().length);
        packet.setAddress(packet.getAddress());
        packet.setPort(packet.getPort());
        socket.send(packet);
        //3.关闭资源
        socket.close();
    }

}
//客户端编码实现
public class AskClient {

    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket,可以指明接收数据的端口,不指明会自动分配
        DatagramSocket socket = new DatagramSocket(9000);
        //2.发送数据包
        String message = "亲,在吗?";
        byte[] buf = message.getBytes();
        int length = buf.length;
        InetAddress ip = InetAddress.getByName("127.0.0.1");
        DatagramPacket packet = new DatagramPacket(buf,length,ip,8088);
        socket.send(packet);
        //接收服务器消息
        byte[] bufS = new byte[1024]; //接收数据包的大小
        int len = buf.length;
        DatagramPacket packetS = new DatagramPacket(bufS,len);
        socket.receive(packetS);
        String msg = new String(packetS.getData(),"utf-8");
        System.out.println("服务器发送的数据:" + msg);
        //3.关闭资源
        socket.close();
    }

}

3.3 多次双向通信

//服务器端编码
public class AskServer {

    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket,指定接收数据的端口
        DatagramSocket socket = new DatagramSocket(8088);
        Scanner input = new Scanner(System.in);
        //2.接收数据包
        while (true){
            byte[] buf = new byte[1024]; //接收数据包的大小
            int length = buf.length;
            DatagramPacket packet = new DatagramPacket(buf,length);
            socket.receive(packet);
            String msg = new String(packet.getData(),0,packet.getLength());
            System.out.println("客户端发送的数据:" + msg);
            if("bye".equals(msg)){
                break; //客户端结束交流,关闭服务器
            }
            //发送数据给客户端
            String s = input.nextLine();
            System.out.println(s);
            packet.setData(s.getBytes());
            packet.setLength(s.getBytes().length);
            packet.setAddress(packet.getAddress());
            packet.setPort(packet.getPort());
            socket.send(packet);
        }
        //3.关闭资源
        socket.close();
    }

}
//客户端编码
public class AskClient {

    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket,可以指明接收数据的端口,不指明会自动分配
        DatagramSocket socket = new DatagramSocket(9000);
        //2.发送数据包
        Scanner input = new Scanner(System.in);
        while (true){
            String message = input.nextLine();
            System.out.println(message);
            byte[] buf = message.getBytes();
            int length = buf.length;
            InetAddress ip = InetAddress.getByName("127.0.0.1");
            DatagramPacket packet = new DatagramPacket(buf,length,ip,8088);
            socket.send(packet);
            if("bye".equals(message)){
                break; //客户端关闭交流
            }
            //接收服务器消息
            byte[] bufS = new byte[1024]; //接收数据包的大小
            int len = buf.length;
            DatagramPacket packetS = new DatagramPacket(bufS,len);
            socket.receive(packetS);
            String msg = new String(packetS.getData(),"utf-8");
            System.out.println("服务器发送的数据:" + msg);
        }
        //3.关闭资源
        socket.close();
    }

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序小达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值