2 nouriel Nouriel 于 2016.01.17 21:24 提问

需要一个java基于UDP协议的文件传输程序

文件是一个实验数据的文件,是txt个格式的,需要将它传输到指定的IP上

2个回答

caozhy
caozhy   Ds   Rxr 2016.01.18 00:07

server

 package com.way.server;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class Server extends Thread {
    private DatagramSocket receive;
    private String ip;
    private int serverPort;
    private int clientPort;
    private File file;
    private String path;
    private DatagramPacket pkg;
    private DatagramPacket messagepkg;


    public Server(String ip, int serverPort, int clientPort, String path) {
        super();
        this.ip = ip;
        this.serverPort = serverPort;
        this.clientPort = clientPort;
        this.path = path;
    }

    public String getPath() {
        return path;
    }

    public String getip() {
        return ip;
    }

    public void setPath(String path) {
        this.ip = path;
    }

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public void receive() {
        try {
            // 接收文件监听端口
            receive = new DatagramSocket(serverPort);
            // 写文件路径
            BufferedOutputStream bos = new BufferedOutputStream(
                    new FileOutputStream(new File(path)));

            // 读取文件包
            byte[] buf = new byte[1024 * 63];
            pkg = new DatagramPacket(buf, buf.length);
            // 发送收到文件后 确认信息包
            byte[] messagebuf = new byte[1024];
            messagebuf = "ok".getBytes();
            messagepkg = new DatagramPacket(messagebuf, messagebuf.length,
                    new InetSocketAddress(ip, clientPort));
            // 循环接收包,每接到一个包后回给对方一个确认信息,对方才发下一个包(避免丢包和乱序),直到收到一个结束包后跳出循环,结束文件传输,关闭流
            while (true) {
                receive.receive(pkg);
                if (new String(pkg.getData(), 0, pkg.getLength()).equals("end")) {
                    System.out.println("文件接收完毕");
                    bos.close();
                    receive.close();
                    break;
                }
                receive.send(messagepkg);
                System.out.println(new String(messagepkg.getData()));
                bos.write(pkg.getData(), 0, pkg.getLength());
                bos.flush();
            }
            bos.close();
            receive.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {
        receive();
    }
}

client

 package com.way.client;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

public class Client extends Thread {
    private DatagramSocket send;
    private DatagramPacket pkg;
    private DatagramPacket messagepkg;
    private int serverPort;
    private int clientPort;
    private String path;
    private File file;
    private String ip;


    public Client(int serverPort, int clientPort, String path, String ip) {
        super();
        this.serverPort = serverPort;
        this.clientPort = clientPort;
        this.path = path;
        this.ip = ip;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public void send() {
        try {
            //文件发送者设置监听端口
            send = new DatagramSocket(clientPort);
            BufferedInputStream bis = new BufferedInputStream(
                    new FileInputStream(new File(path)));
            //确认信息包
            byte[] messagebuf = new byte[1024];
            messagepkg = new DatagramPacket(messagebuf, messagebuf.length);
            //文件包
            byte[] buf = new byte[1024 * 63];
            int len;
            while ((len = bis.read(buf)) != -1) {

                pkg = new DatagramPacket(buf, len, new InetSocketAddress(
                        ip, serverPort));
                //设置确认信息接收时间,3秒后未收到对方确认信息,则重新发送一次
                send.setSoTimeout(3000);
                while (true) {
                    send.send(pkg);
                    send.receive(messagepkg);
                    System.out.println(new String(messagepkg.getData()));
                    break;
                }
            }
            // 文件传完后,发送一个结束包
            buf = "end".getBytes();
            DatagramPacket endpkg = new DatagramPacket(buf, buf.length,
                    new InetSocketAddress(ip, serverPort));
            System.out.println("文件发送完毕");
            send.send(endpkg);
            bis.close();
            send.close();

        } catch (SocketException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void run() {
        send();
    }
}

完整代码
http://dl.iteye.com/topics/download/585df859-c4a4-3a49-82d0-3c261fcf3303

enpterexpress
enpterexpress   Rxr 2016.01.18 09:07
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
udp可靠文件传输实现(基于滑动窗口机制)
老板逼着让写一个基于UDP可靠通信的demo以作为其网络课程的课件内容之一来给学生演示  dup是不可靠的,为了实现可靠文件传输,需要加入额外的机制来确保可靠,在此选用了滑动窗口机制。   滑动窗口介绍: 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口
一个基于UDP协议的文件传输应用程序的实现
一个基于UDP协议的文件传输应用程序的实现 简单实用
Java实现udp协议的文件传输
使用Java语言编写程序,设计UDP服务器。考虑到实时性,采用UDP协议。 1.设计一个简单的界面,使得程序能够流畅的完成视频文件的传输。
基于文件传输的UDP协议分析(1)
*网络通信与数据交换已经成为现代软件必备的基础功能。 *目前公司上下位机的网络通信均采用 TCP/ UDP 协议进行数据交换和控制。这种低层次的网络通信协议在小数据量,少互交的领域有着较大的优势。但是随着网络功能需求的日趋旺盛, TCP/UDP 协议日渐无法满足需求,其弊端日渐明显 *TCP/UDP通信编程可分为: * 1  通信控制层 *通信控制层负责网络的配置,连
基于UDP协议的文件传输
客户端将本地文件传输给服务端,服务端接收文件并保存,输出文件名和内容 客户端: #include #include #include #pragma comment(lib,"ws2_32.lib") int main() { WSAData wsaData; int err=WSAStartup(WINSOCK_VERSION,&wsaData); if(0!=err) { re
java实现TCP与UDP混合传输文件总结
java实现TCP与UDP混合传输文件总结    最近在用java写基于UDP传输文件的网络,遇到了很多问题,也参考了很多人编写的程序,通过 自己的整理和设计,终于写完了自己程序,现在将在编程中遇到的问题总结一下。发送方:     首先发送方需要发送文件的一些属性给文件接收方,如文件的名称,文件的大小等,让文件接收方判断是否接受文件,由于这部分内容比较重要,不能出现丢包的现象,所以采用TC
15.基于UDP协议的聊天室程序
使用UDP协议完成一个聊天室程序的小项目,大部分代码都有注释,一看就能看到的. 实现的功能:               (1)查看/显示已经登陆的用户信息               (2)向已登陆的用户发送消息               (3)输出错误消息,给予提示               (4)退出 共有三个文件: chat_public.h
基于udp的可靠文件传输
udt,一种基于udp协议的可靠文件传输协议
基于滑动窗口协议写的程序(UDP实现)
正好有一个大作业关于用socket实现滑动窗口协议,所以写了一个,模拟接收方与发送方窗口都是2,用两个线程实现。 下面是代码,注释的比较详细了。 socket_udp.h #include #include #include #include #include //#include "winsock2.h" #pragma comment(lib,"WS2_32.LIB") #de
Windows下基于UDP的可靠传输协议实现
前言:在公司实习了三个月,有一个月都是在做基于UDP协议的应用层软件开发,目的是要用在流媒体服务器上,传输高清视频图像帧。整个开发过程,从0到最后完成了几百兆以上的大文件可靠传输。UDP网络传输协议部分编程,由于存在丢包问题,确实有点复杂,现在分享一下自己的开发经验。 #ifndef UDPNONBLOCKINGOUTPUT #define UDPNONBLOCKINGOUTPUT #inclu