java实现UDP的发送端和接收端

Java中的UDP通信

  • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
  • Java提供了DatagramSocket类作为基于UDP协议的Socket

构造方法

方法说明
DatagramSocket()创建数据报套接字并将其绑定到本机地址上的任何可用端口
DatagramPacket(byte[] buf,int len,InetAddress add,int port)创建数据包,发送长度为len的数据包到指定主机的指定端口

相关方法

方法名说明
void send(DatagramPacket p)发送数据报包
void close()关闭数据报套接字
void receive(DatagramPacket p)从此套接字接受数据报包

发送数据的步骤

  • 创建发送端的Socket对象(DatagramSocket)
  • 创建数据,并把数据打包
  • 调用DatagramSocket对象的方法发送数据
  • 关闭发送端

接收端Main的代码

package _receive_server;

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Main {
    public static void main(String[] args) throws IOException {
        //创建DatagramSocket对象,绑定端口号,要和发送端口号一致
        DatagramSocket socket = new DatagramSocket(6666);
        DatagramPacket packet = new DatagramPacket(new byte[1024*8],1024*8);
        //创建用来接收文件的文件夹
        File dir = new File("文件接受夹");
        if (!dir.exists()){
            dir.mkdirs();
        }
        //接收packet对象
        socket.receive(packet);
        System.out.println("开始接收文件");
        //创建字节数组,接收发送端首先发送过来的一个包:文件名字包,然后在本地创建同名同后缀的文件
        byte[] nameData = packet.getData();
        int nameLength = packet.getLength();
        String fileName = new String(nameData,0,nameLength);
        File file = new File(dir,fileName);
        file.createNewFile();
        //这里用缓冲字节输入流来输出文件,如果用普通字节流来输出会导致丢包,数据传输不完整,例如接收到的图片不完整
        BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(file));
        //接收第二个包,循环输出接收到的文件到本地中
        while (true){
            socket.receive(packet);
            byte[] data = packet.getData();
            int length = packet.getLength();
            System.out.println(length);
            //设置循环的出口,即第三个包的长度设置为0,当length为0时,跳出循环
            if (length == 0){
                break;
            }
            os.write(data,0,length);
        }
        //关闭流
        os.close();
        System.out.println("文件接收完毕");

    }
}

发送端SendDemo的代码

package _receive_server;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class SendDemo {
    public static void main(String[] args) throws IOException {
        //创建需要发的文件的file对象
        File file = new File("C:\\Users\\14251\\Pictures\\Screenshots\\屏幕截图(109).png");
        //设置发送端的端口号
        DatagramSocket socket = new DatagramSocket(4396);
        //创建字节输入流
        InputStream inputStream = new FileInputStream(file);
        //创建字节数组
        byte[] arr = new byte[1024];
        int len;
        //创建数据包对象packet
        DatagramPacket packet;
        byte[] name = "屏幕截图(109).png".getBytes();
        //设置接收端的端口号,下面是我自己电脑的IP地址,也可以是127.0.0.1(通用本机IP地址)
        InetAddress ip = InetAddress.getByName("192.168.1.53");
        //设置接收端的端口号
        int port = 6666;
        //这里是创建第一个包,用来装文件名和文件后缀
        packet = new DatagramPacket(name,name.length,ip,port);
        //发送包
        socket.send(packet);
        //设置第二个包,发送文件的内容,即文件本体并发送
        while ((len = inputStream.read(arr)) != -1){
            packet = new DatagramPacket(arr,len,ip,port);
            socket.send(packet);
        }
        //设置让接收端的while循环的出口,这里是设置第三个包的length为0,当Main方法里的while的length为0时,跳出循环
        socket.send(new DatagramPacket(new byte[0],0,ip,port));
        //关闭流
        socket.close();
    }
}

运行效果

(先运行接收端,再运行发送端)
在这里插入图片描述
首先在本地中创建了“文件接收夹”文件夹
在这里插入图片描述
然后把接收到的文件复制到本地当中
在这里插入图片描述
到这里使用UDP现实发送端和接收端的功能已经实现,值得注意的是,UDP的缺点,只能发送接收到比较小的文件,像是发送500M左右以上的文件,会发生丢包,使用UDP来实现文件传送无法避免数据丢失(本人还没找到新的方法解决这个问题)。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值