基于UDP的Java网络套接字编程

本文详细介绍了基于UDP的Java网络编程,包括TCP与UDP的区别,以及如何使用DatagramSocket进行单向和双向通信。通过示例代码展示了发送和接收数据包的过程,并加入了异常处理以确保程序稳定性。最后,实现了一个简单的聊天应用,允许双方持续交互直至一方退出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于UDP的Java网络编程

TCP

  • TCP:
    • 客户端:Socket 程序感受到的 使用流 :输出流
    • 服务器端: ServerSocket —>Socket 程序感受到的 使用流 :输入流
    • (客户端和服务器端地位不平等。)

UDP

  • UDP:
    • 发送方:DatagramSocket 发送:数据包 DatagramPacket
    • 接收方:DatagramSocket 接收:数据包 DatagramPacket
    • (发送方和接收方的地址是平等的。)

功能分解1—单向通信

实现

  • 发送方
package com.ruan.test04;

import java.io.IOException;
import java.net.*;

public class Send {
    public static void main(String[] args) throws IOException {
        System.out.println("发送方上线");
        //1.准备套接字,指定发送的端口号
        DatagramSocket datagramSocket = new DatagramSocket(8888);
        //2.准备数据包
        String str = "Hello";
        byte[] bytes = str.getBytes();
        /**
         * 待发送的数据包需要四个参数
         * 1.待传输数据转为字节数组
         * 2.字节数组的长度
         * 3.封装接收方的ip
         * 4.指定接收方的端口号
         */
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"),9999);//数据包
        //发送
        datagramSocket.send(datagramPacket);
        //关闭流
        datagramSocket.close();
    }
}

  • 接收方
package com.ruan.test04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;

public class Receive {
    public static void main(String[] args) throws IOException {
        System.out.println("接收方上线");
        //准备套接字,指定接收端口
        DatagramSocket datagramSocket = new DatagramSocket(9999);
        //创建一个空数据包用于接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//空数据包
        //接收数据,并将数据写入数据包
        datagramSocket.receive(datagramPacket);
        //读取数据
        byte[] data = datagramPacket.getData();
        String s = new String(data, 0, datagramPacket.getLength());
        System.out.println("接收到数据"+s);
    }
}

功能分解2—双向通信

实现

  • 发送方
package com.ruan.test04;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class Send {
    public static void main(String[] args) throws IOException {
        System.out.println("====发送方上线=====");
        //1.准备套接字,指定发送的端口号

        
            DatagramSocket datagramSocket = new DatagramSocket(8888);
            Scanner scanner = new Scanner(System.in);
            //2.准备数据包
            String str = scanner.nextLine();
            byte[] bytes = str.getBytes();
            /**
             * 待发送的数据包需要四个参数
             * 1.待传输数据转为字节数组
             * 2.字节数组的长度
             * 3.封装接收方的ip
             * 4.指定接收方的端口号
             */
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9999);//数据包
            //发送
            datagramSocket.send(datagramPacket);
            byte[] bytes1 = new byte[1024];
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes.length);
            datagramSocket.receive(datagramPacket1);
            byte[] data = datagramPacket1.getData();
            String s = new String(data, 0, datagramPacket1.getLength());
            System.out.println("服务机:" + s);
            //关闭流
            datagramSocket.close();
        
    }
}

  • 服务方
package com.ruan.test04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;

public class Receive {
    public static void main(String[] args) throws IOException {
        System.out.println("====接收方上线====");
        //准备套接字,指定接收端口

        
            DatagramSocket datagramSocket = new DatagramSocket(9999);
            Scanner scanner = new Scanner(System.in);
            //创建一个空数据包用于接收数据
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//空数据包
            //接收数据,并将数据写入数据包
            datagramSocket.receive(datagramPacket);
            //读取数据
            byte[] data = datagramPacket.getData();
            String s = new String(data, 0, datagramPacket.getLength());
            System.out.println("发送机:" + s);
            //回复信息
            String str = scanner.nextLine();
            byte[] bytes1 = str.getBytes();
            DatagramPacket localhost = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("localhost"), 8888);
            datagramSocket.send(localhost);
            datagramSocket.close();
        
    }
}

分解功能3—加入完整的异常处理

实现

  • 发送方
package com.ruan.test04;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class Send {
    public static void main(String[] args){
        System.out.println("====发送方上线=====");
        //1.准备套接字,指定发送的端口号
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(8888);
            Scanner scanner = new Scanner(System.in);
            //2.准备数据包
            String str = scanner.nextLine();
            byte[] bytes = str.getBytes();
            /**
             * 待发送的数据包需要四个参数
             * 1.待传输数据转为字节数组
             * 2.字节数组的长度
             * 3.封装接收方的ip
             * 4.指定接收方的端口号
             */
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9999);//数据包
            //发送
            datagramSocket.send(datagramPacket);
            byte[] bytes1 = new byte[1024];
            DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes.length);
            datagramSocket.receive(datagramPacket1);
            byte[] data = datagramPacket1.getData();
            String s = new String(data, 0, datagramPacket1.getLength());
            System.out.println("服务机:" + s);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            datagramSocket.close();
        }
    }
}

  • 接收方
package com.ruan.test04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;

public class Receive {
    public static void main(String[] args) {
        System.out.println("====接收方上线====");
        //准备套接字,指定接收端口
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(9999);
            Scanner scanner = new Scanner(System.in);
            //创建一个空数据包用于接收数据
            byte[] bytes = new byte[1024];
            DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//空数据包
            //接收数据,并将数据写入数据包
            datagramSocket.receive(datagramPacket);
            //读取数据
            byte[] data = datagramPacket.getData();
            String s = new String(data, 0, datagramPacket.getLength());
            System.out.println("发送机:" + s);
            //回复信息
            String str = scanner.nextLine();
            byte[] bytes1 = str.getBytes();
            DatagramPacket localhost = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("localhost"), 8888);
            datagramSocket.send(localhost);
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            datagramSocket.close();
        }
    }
}

分解功能4—正常通信

实现

  • 发送方
package com.ruan.test04;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class Send {
    public static void main(String[] args){
        System.out.println("====发送方上线=====");
        //1.准备套接字,指定发送的端口号
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(8888);
            Scanner scanner = new Scanner(System.in);
            while (true){
                //2.准备数据包
                System.out.print("发送机:");
                String str = scanner.nextLine();
                byte[] bytes = str.getBytes();
                /**
                 * 待发送的数据包需要四个参数
                 * 1.待传输数据转为字节数组
                 * 2.字节数组的长度
                 * 3.封装接收方的ip
                 * 4.指定接收方的端口号
                 */
                DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9999);//数据包
                //发送
                datagramSocket.send(datagramPacket);
                if (str.equals("beybey")){
                    System.out.println("服务下线");
                    break;
                }
                byte[] bytes1 = new byte[1024];
                DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes.length);
                datagramSocket.receive(datagramPacket1);
                byte[] data = datagramPacket1.getData();
                String s = new String(data, 0, datagramPacket1.getLength());
                System.out.println("服务机:" + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭流
            datagramSocket.close();
        }
    }
}

  • 接收方
package com.ruan.test04;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;

public class Receive {
    public static void main(String[] args) {
        System.out.println("====接收方上线====");
        //准备套接字,指定接收端口
        DatagramSocket datagramSocket = null;
        try {
            datagramSocket = new DatagramSocket(9999);
            Scanner scanner = new Scanner(System.in);
            while (true){
                //创建一个空数据包用于接收数据
                byte[] bytes = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//空数据包
                //接收数据,并将数据写入数据包
                datagramSocket.receive(datagramPacket);
                //读取数据
                byte[] data = datagramPacket.getData();
                String s = new String(data, 0, datagramPacket.getLength());
                System.out.println("发送机:" + s);
                if (s.equals("byebye")){
                    System.out.println("服务下线");
                    break;
                }
                //回复信息
                System.out.print("接收机:");
                String str = scanner.nextLine();
                byte[] bytes1 = str.getBytes();
                DatagramPacket localhost = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("localhost"), 8888);
                datagramSocket.send(localhost);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            datagramSocket.close();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值