我正在尝试用Java创建一个简单的UDP文件传输应用程序(服务器和客户端),但我几乎没有任何经验,但仍然经历了一些基础知识。我已经设法制作了一个功能性应用程序,例如将我的笔记本电脑中的选定文件发送到我的桌面,但是使用TCP。
基本上,我想要做的是一个应用程序,您可以选择一个选项来列出服务器上的文件(特定的默认文件夹,在本例中为C:\ Sharefolder),一个将文件上传到服务器的选项,以及从服务器下载文件的另一个选项。我如何在客户端的方法中做到这一点?
这是我到目前为止客户端的代码,我不知道我是否朝着正确的方向前进。我在底部区域仍然有一些旧的TCP程序代码,所以没关系。
public class Client {
private final static int PACKETSIZE = 100 ;
public static void upload(String ipadd, String iport, String fname) {
DatagramSocket socket = null ;
try {
InetAddress host = InetAddress.getByName(ipadd);
int port = Integer.parseInt(iport);
socket = new DatagramSocket(port, host) ;
File file = new File("C:\\Sharefolder\\" +fname);
long size = file.length();
if (size > Integer.MAX_VALUE) {
System.out.println("File too big");
}
byte[] bytes = new byte[(int) size];
for(int i=0; i<size; i++) {
//Send file bytes to a byte array?
}
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, host, port ) ;
byte[] bytes = new byte[(int) size];
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());
int count;
while ((count = bis.read(bytes)) > 0) {
out.write(bytes, 0, count);
}
out.flush();
out.close();
fis.close();
bis.close();
socket.close();
如果有人能指出我可以帮助我检查我应该对我的代码做什么,那将非常感激。谢谢!
答案 0 :(得分:1)
我不理解do this in terms of method in the client
的请求。在高级别,您将拥有您的操作定义的方法(listFiles(path)
,uploadFile(localPath, remotePath)
和downloadFile(localPath, remotePath)
。)
问题是UDP不可靠,因此您必须控制数据真正到来。
您需要的一些提示:
1)描述您的内容格式的迷你协议(每个命令命令的消息,如何传递参数/数据)等。
2)一旦发送了消息,您需要设置超时并且(如果没有收到回复)再次发送消息。
3)当您收到/发送文件时,它将是几个块(Datagrams最大有效载荷为64K,除非您使用的是IPv6)。控制订单,检查所有订单是否到达,请求退回未到达的订单。
4)玩得开心!
这比TCP更复杂,因为你必须控制很多TCP控制的东西,但是可以完成。既然你没有提到它们,我会跟那些给你作业的人检查约束(你能使用IPv6吗?这是通过所需的最大文件大小?)
答案 1 :(得分:1)
这个编程任务是让你设计一个简单的文件传输协议,它是一个应用层协议。但不像FTP,你必须使用UDP作为底层传输协议。如果您希望它有点健壮,我认为您可能必须解决以下问题: