目录
FTP(File Transfer Protocol,文件传输协议)
UDP(用户数据报协议):
使用 UDP(用户数据报协议)传输文件不是一种常见和推荐的方式,因为 UDP 是无连接、不可靠的协议,不保证数据包的顺序和完整性。
但如果非要使用 UDP 来传输文件,可以考虑以下步骤:
分割文件:将文件分割成固定大小的数据块。
为每个数据块添加包头:包头中包含数据块的序号、总数据块数等信息,以便接收方重组文件。
发送数据块:使用 UDP 套接字逐个发送数据块。
接收数据块:接收方接收到数据块后,根据包头中的序号将其存储在合适的位置。
重组文件:当接收完所有数据块后,按照序号重组文件。
实例代码:
服务端:
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpServer { public static void main(String[] args) { //创建Socket,监听6666端口 try(DatagramSocket serverSocket=new DatagramSocket(6666)){ //读取来自客户端的”数据包“ //创建数据包 byte[] buff=new byte[1024]; DatagramPacket serverPacket=new DatagramPacket(buff,buff.length); //接收数据包 serverSocket.receive(serverPacket); System.out.println("读取完毕!"); //从数据包中,读取数据 byte[] data= serverPacket.getData(); String str=new String(data).trim(); System.out.println("接收的数据为:"+str); if("天王盖地虎!".equals(str)){ serverPacket.setData("宝塔镇河妖!".getBytes()); }else{ serverPacket.setData("给劳资出去!".getBytes()); } //反馈信息给客户端(发送数据包至客户端) serverSocket.send(serverPacket); } catch (SocketException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
客户端:
import java.io.IOException; import java.net.*; public class UdpClient { public static void main(String[] args) { //创建Socket try(DatagramSocket clientSocket=new DatagramSocket()){ //连接指定主机的端口 clientSocket.connect(InetAddress.getByName("192.168.199.143"),6666); //创建数据包 DatagramPacket clientPacket=new DatagramPacket(new byte[1024],1024); //将数据放入数据包 clientPacket.setData("天王盖地虎!".getBytes()); //发送数据包 clientSocket.send(clientPacket); //等待接收反馈信息(等待接收来自服务端的数据包) clientSocket.receive(clientPacket); byte[] data=clientPacket.getData(); String ans=new String(data); System.out.println("来自服务端的信息:"+ans); } catch (SocketException e) { throw new RuntimeException(e); } catch (UnknownHostException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
DatagramSocket:
DatagramSocket
是 Java 中用于实现 UDP(用户数据报协议)通信的类。
它代表了 UDP 通信中的端点,可以用于发送和接收数据报(DatagramPacket
)。
通过创建 DatagramSocket
对象,可以指定端口来监听传入的数据报,或者不指定端口让系统自动分配可用端口。使用 DatagramSocket
可以发送数据报到指定的目标地址和端口,也可以从网络中接收数据报。
DatagramPacket:
DatagramPacket
在 Java 中用于表示 UDP(用户数据报协议)的数据报。
它包含了要发送或已经接收的数据,以及与数据相关的一些元信息,例如数据的目标地址(包括 IP 地址和端口号)或者数据的来源地址(在接收数据报时)。
具体来说:
对于发送数据,通过创建一个包含数据、目标 IP 地址和端口的
DatagramPacket
对象,然后使用DatagramSocket
来发送这个数据报。对于接收数据,当使用
DatagramSocket
接收数据时,接收到的数据会被封装在一个DatagramPacket
对象中,通过这个对象可以获取数据以及发送方的地址和端口等信息。
FTP(File Transfer Protocol,文件传输协议)
FTP是用于在网络上进行文件传输的标准协议。
FTP 传输文件的一般步骤:
建立连接:客户端与 FTP 服务器建立连接。这通常需要提供服务器的地址、用户名和密码。
选择传输模式:FTP 支持两种传输模式,主动模式和被动模式。
- )主动模式:客户端向服务器发送 PORT 命令,告知服务器连接客户端的特定端口以建立数据连接。
- )被动模式:客户端向服务器发送 PASV 命令,服务器响应并告知客户端一个用于建立数据连接的端口。
导航目录:客户端可以使用命令(如
CD
)在服务器的文件系统中导航到目标目录。上传文件(从客户端到服务器):
- )使用
STOR
命令指定要上传的本地文件和服务器上的目标文件名。
- )使用
下载文件(从服务器到客户端):
- )使用
RETR
命令指定要下载的服务器文件和本地的目标文件名。
- )使用
关闭连接
在 Java 中,可以使用第三方库(如 Apache Commons Net)来实现 FTP 文件传输。
实例代码:
import org.apache.commons.net.ftp.FTPClient; import java.io.FileInputStream; import java.io.IOException; public class FtpUploadExample { public static void main(String[] args) { String server = "ftp.example.com"; int port = 21; String username = "username"; String password = "password"; //创建FTP客户端(FTPClient对象),用于FTP服务器的连接访问 FTPClient ftpClient = new FTPClient(); try { ftpClient.connect(server, port);//连接 ftpClient.login(username, password);//登录 ftpClient.enterLocalPassiveMode(); String remoteFilePath = "/remote/directory/file.txt"; String localFilePath = "/local/directory/file.txt"; FileInputStream inputStream = new FileInputStream(localFilePath); //保存文件(上传本地文件至FTP服务器当前用户目录下) boolean success = ftpClient.storeFile(remoteFilePath, inputStream); if (success) { System.out.println("File uploaded successfully."); } else { System.out.println("Failed to upload file."); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (ftpClient.isConnected()) { ftpClient.disconnect(); } } catch (IOException e) { e.printStackTrace(); } } } }
上述代码中,首先创建 FTPClient
对象,然后连接到 FTP 服务器、登录、设置传输模式,并使用 storeFile
方法上传文件。最后,在完成操作后关闭连接。