Java:Socket文件传输
此博客为实例代码,其余请参考我的其他博客:
Java TCP通信:https://blog.csdn.net/qq_39004632/article/details/93598528
Java 多线程Socket:https://blog.csdn.net/qq_39004632/article/details/93599058
Java TCP传输对象:https://blog.csdn.net/qq_39004632/article/details/93602381
客户端代码:
public class FileTransferClient {
private Socket socket;
private int port = 20001;
public FileTransferClient() {
try {
socket = new Socket(InetAddress.getByName("localhost"), port);
System.out.println("与服务器连接成功");
} catch (Exception ex) {
System.out.println("与服务器连接失败");
ex.printStackTrace();
}
}
public void receive() {
try {
String savePath = "E:\\"; // 本地保存路径
byte buffer[] = new byte[8192]; // 接收数据的缓冲区
int passedlen = 0;
long len = 0;
// 打开socket的输入流(也就是服务器端的输出流)
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
savePath += inputStream.readUTF(); // 读取文件名
// 创建对文件进行写操作的输出流
DataOutputStream fileOut = new DataOutputStream((new BufferedOutputStream(new FileOutputStream(savePath))));
len = inputStream.readLong(); // 读取文件的长度
System.out.println("文件的长度为:" + len);
System.out.println("开始接收文件!");
while (true) {
int read = 0;
if (inputStream != null) {
read = inputStream.read(buffer);
}
passedlen += read;
if (read == -1) {
break;
}
System.out.println("文件接收了" + (passedlen * 100 / len) + "%\n");
fileOut.write(buffer, 0, read);
}
System.out.println("接收完成,文件存为" + savePath + "\n");
fileOut.close();
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String arg[]) {
new FileTransferClient().receive();
}
}
服务器代码:
public class FileTransferServer {
private String filePath; // 文件路径
private String fileSize; // 文件大小
private int port; // 端口号
private ServerSocket server; // 服务器端Socket
public FileTransferServer(int port, String filePath) throws IOException {
this.port = port;
this.filePath = filePath;
server = new ServerSocket(port);
}
public void transfer() {
try {
File file = new File(filePath); // 创建要传递的文件对象
System.out.println("要传递的文件大小是:" + file.length());
Socket socket = server.accept(); // 监听客户端的请求
System.out.println("服务器已经与客户端建立连接");
// 创建输入流与要传递的文件进行关联
DataInputStream dInStream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
DataOutputStream serverOutputStream = new DataOutputStream(socket.getOutputStream());
// 将文件名和文件长度传递给客户端,考虑到文件名是中文的格式用writeUTF方法
serverOutputStream.writeUTF(file.getName());
serverOutputStream.flush();
serverOutputStream.writeLong((long) file.length());
serverOutputStream.flush();
// 以下代码用于发送文件的内容部分
byte buffer[] = new byte[8129]; // 数据缓冲区8K
while (true) {
int read = 0;
if (dInStream != null) {
read = dInStream.read(buffer); // 从文件关联的输入流中读取数据
if (read != -1)
serverOutputStream.write(buffer, 0, read); // 将缓冲区中的数据写入到Socket的输出流中
else
break;
}
}
serverOutputStream.flush(); // 强制将缓冲区的数据输出
System.out.println("文件传送完毕");
dInStream.close();
serverOutputStream.close();
socket.close(); // 关闭流和socket
} catch (FileNotFoundException e1) {
System.out.println("要传送的文件不存在");
} catch (SocketException e2) {
e2.printStackTrace();
} catch (IOException e3) {
e3.printStackTrace();
}
}
public static void main(String args[]) throws IOException {
new FileTransferServer(20001, "D:\\abc.rar").transfer();
}
}