IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Java实现UDP套接字大文件可靠传输 -> 正文阅读

[网络协议]Java实现UDP套接字大文件可靠传输

因为本人是在本机测试的🙁,所以估计应该是有BUG的,请各位大佬指出

题目

使用UDP套接字实现文件传输
实现任意类型的文件传输
不限定文件大小,测试时至少要用10M以上大小的文件测试

分析

因为UDP是不可靠传输,中途可能存在丢包问题,所以解决思路是,客服端发一次访问请求等到服务端响应,只有第一次响应后,才能证明客户端的数据库包是可能达到服务器客户端每发一次包,都等待服务器响应确认是否已经达到后,客户端才能再次发送数据包

测试截图

客户端

请添加图片描述
服务端
在这里插入图片描述
测试结果截图
在这里插入图片描述

udpFileClient客户端请求上传文件

import java.io.*;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

public class udpFileClient {
    private String fileName="D:/desktop/video.mp4";
    private int serverPort=16667;
    private InetAddress serverIp=null; //localhost
    private DatagramSocket socket=null;  //16666
    private DatagramPacket datagramPacket=null;
    private byte[] successMark= "success data mark".getBytes();
    private byte[] overMark= "over mark".getBytes();
    public udpFileClient(){
        try {
            serverPort=16667;
            serverIp=InetAddress.getByName("localhost");
            //创建一个本地任意UDP套接字
            socket=new DatagramSocket(16666);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public boolean presendFile(){
        try {
            String msg="client file:"+this.fileName;
            datagramPacket=new DatagramPacket(msg.getBytes(),msg.length(),serverIp,serverPort);
            socket.send(datagramPacket);
            datagramPacket=new DatagramPacket(new byte[1024],1024);
            socket.receive(datagramPacket);
            msg=new String(datagramPacket.getData(),
                    0,datagramPacket.getLength());
            System.out.println("msg:"+msg);
            if(msg.equals("server: can transport file")){
                return true;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
    public boolean check(byte[]send,byte[]receive){
        if(receive==null||receive.length==0){
            return false;
        }
        for(int i=0;i<Math.min(send.length,receive.length);i++){
            if(send[i]!=receive[i]){
                return false;
            }
        }
        return true;
    }
    public  void sendFile(String FileName){
        fileName=FileName;
        try {
//            FileInputStream fileInputStream = new FileInputStream(fileName);
            RandomAccessFile accessFile = new RandomAccessFile(fileName, "r");
            int readSize=-1;
            int sendCount=0,sendGroup=0;
            byte []buf=new byte[1024];
            byte []receiveBuf=new byte[1024];
            String msg=null;
            datagramPacket=new DatagramPacket(buf,1024,serverIp,serverPort);
            while((readSize = accessFile.read(buf,0,buf.length)) != -1){
                datagramPacket.setData(buf,0,readSize);
                socket.send(datagramPacket);
                sendCount++;
                while(true){
                    datagramPacket.setData(receiveBuf,0,receiveBuf.length);
                    socket.receive(datagramPacket);
                    System.out.println("receiveBuf:"+receiveBuf+" VS successMark:"+successMark);
                    System.out.println("receiveBuf String:"+new String(receiveBuf,0,receiveBuf.length,StandardCharsets.UTF_8)+" VS successMark String:"+new String(successMark));
                    if(check(successMark,receiveBuf)){
                        sendGroup++;
                        break;
                    }else{
                        System.out.println("resend sendGroup:"+sendGroup+1);
                        System.out.println("resend sendCount:"+sendCount++);
                        datagramPacket.setData(buf,0,readSize);
                        socket.send(datagramPacket);
                    }
                }
            }
            System.out.println("over mark");
            datagramPacket.setData(overMark,0,overMark.length);
            socket.send(datagramPacket);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            socket.close();
        }
    }

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        udpFileClient udpFileClient = new udpFileClient();
        System.out.println("尝试连接服务端......");
        if(udpFileClient.presendFile()){
            System.out.println("连接服务器成功,开始发送文件......");
            udpFileClient.sendFile(udpFileClient.fileName);
        }else {
            System.out.println("网络不稳定,连接服务器失败....");
        }
    }

}

udpFileServer 服务端响应接受文件

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


public  class udpFileServer {
    private String filename="";
    private int clientPort=16666;
    private InetSocketAddress clientIp=null;
    private DatagramSocket socket=null;
    private DatagramPacket datagramPacket=null;
    private byte[] successMark= "success data mark".getBytes();
    private byte[] overMark= "over mark".getBytes();
    public udpFileServer(){
        try {
            clientPort=16666;
            clientIp=new InetSocketAddress(InetAddress.getByName("localhost"),clientPort);
            socket=new DatagramSocket(16667, InetAddress.getByName("localhost"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        System.out.println("UDP FILE SERVER START...");
        udpFileServer udpFileServer = new udpFileServer();
        udpFileServer.run();
    }
    public boolean check(byte[]send,byte[]receive){
        if(receive==null||receive.length==0){
            return false;
        }
        for(int i=0;i<Math.min(send.length,receive.length);i++){
            if(send[i]!=receive[i]){
                return false;
            }
        }
        return true;
    }
    public void run() {
        try {
            byte[] buf = new byte[1024];
            datagramPacket=new DatagramPacket(buf,0,1024,clientIp);
            socket.receive(datagramPacket);
            String msg = new String(buf,0,datagramPacket.getLength());
            System.out.println("客服端ip:"+datagramPacket.getAddress()+" port:"+datagramPacket.getPort()+" -》 "+msg);
            msg = msg.substring(12);
            for(int i=msg.length()-1;i>=0;i--){
                if(msg.charAt(i)=='.'){
                    filename=msg.substring(0,i)+"(1)"+msg.substring(i);
                    break;
                }
            }
            System.out.println("新文件名:"+filename);
            datagramPacket.setData(("server: can transport file").getBytes());
            socket.send(datagramPacket);
            
            File file = new File(filename);
            if(file.exists()){
                file.delete();
                System.out.println("文件已存在,删除后新创建");
            }
            int reciveCount=0;
            int readSize=0;
            datagramPacket=new DatagramPacket(buf,0,1024);
            socket.receive(datagramPacket);
            System.out.println("reciveCount:"+reciveCount++);
            FileOutputStream fileOutputStream = new FileOutputStream(filename);
            while((readSize=datagramPacket.getLength())!=0){
                msg = new String(buf,0, readSize);
                System.out.println(msg);
                if(check(overMark,buf)){
                    System.out.println("over mark");
                    break;
                }
                fileOutputStream.write(buf,0,readSize);
                fileOutputStream.flush();
                datagramPacket.setData(successMark,0,successMark.length);
                System.out.println("successMark"+successMark);
                socket.send(datagramPacket);
                datagramPacket.setData(buf,0,buf.length);
                socket.receive(datagramPacket);
                System.out.println("reciveCount:"+reciveCount++);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        finally {
            socket.close();
        }


    }

}
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 17:07:55  更:2021-12-02 17:09:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:43:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码