刚学完Java,用UDP实现文件传输,实现有规律接收包。Java学得不是很好,希望高手看到指点一下。
还有部分代码未贴出,在下面附件中。
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();
}
}
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();
}
}
分享到:
相关推荐
本资源是使用 java,分别用 TCP 和 UDP 传输文件的源代码。读者朋友可以下载下来,参考着满足自己的需求。 另有博客《Java 使用 TCP 和 UDP 传输文件》可以参考,地址是:...
UDP传输的优点是快捷,因为它是没有安全保证的。有一定的丢失率。而且,由于各包的传输路径不同,后发送的包可能先于先发送的包到达。所以,如果发送大量的数据,就需要进行检错。当然,还得保证快捷的传输。 我就是...
使用Java语言编写程序,设计UDP服务器。考虑到实时性,采用UDP协议。 1.设计一个简单的界面,使得程序能够流畅的完成视频文件的传输。
UDP实现可靠文件传输 既能实现UDP传输的速率,又能保证可靠,对丢包,乱序等进行处理后组合
现在, 通过网络传输文件已经非常普遍, 各种传输工 具也很多, 最具有代表性的就是 QQ 提供的文件传输功能了, 它能让好友之间方便的把自己的文件传给对方。 仔细查看 QQ 的传输文件功能, 发现它没有文件类型的...
用udp实现可靠数据传递,从本机固定位置读取一个文件,通过udp实现可靠传输
java udp 协议 文件传输
1、java socket 2、UDP传输协议 3、json数据格式 4、简易聊天室程序实现
这两天下了一个使用UDP传输目录内文件的程序,发出来给大家一起看看,共同进步。有问题请指教。 由于udp丢包比较厉害,因此使用了自定义的内部协议,进行双方的确认。 程序跑起来后,看网络状况,有时候会一卡一卡的...
自己写的额外代码来保障UDP可靠的文件传输 解决UDP传输丢包问题。
2) 基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient; 3) 服务器端启动时需传递root...7) 服务器端支持多用户并发访问,不用考虑文件过大或UDP传输不可靠的问题。
两个应用应该分别利用 UDP 和 TCP 协议,以具有传输至少 1 MB 文件的能力。 实现和说明 源代码 两个应用都由单个程序实现,源代码下载地址。 说明 程序使用以下命令行进行编译: javac *.java ...
UDP是面向非连接的,UDP传输的是数据报只负责传输信息,不保证信息一定收到,虽然安全性不如TCP(面向连接、用Socket进行通信),但是性能较好。 从简单到复杂,首先简单介绍一下怎么利用UDP实现客服端发送消息给...
java socket 大文件传输,快速传输, 数据包的分片,组装,涉及UDP,TCP传输技术,NIO非阻塞等等,适合对socket编程进一步学习的同学
利用java技术实现多线程文件传输
一个用java实现的UDP通信程序,有详细注释,有测试UI,成功解决了UDP丢包问题。程序正确可运行。
2) 基于Java Socket TCP和UDP实现一个简易的网络文件服务程序,包含服务器端FileServer和客户端FileClient; 3) 服务器端启动时需传递root目录参数,并校验该目录是否有效; 。。。。。。附带简单的实验报告,只需...
滑动窗口机制实现的UDP可靠性传输(自己写的JAVA类)
采用Java语言实现了TCP和UDP传输,TCP方面具体功能有:在客户端获取服务器根目录下文件列表、大小等,进入指定文件夹,退出文件夹;UDP方面的功能有:在客户端通过get方法获取服务器指定文件并下载到指定路径。