千家信息网

Java怎么利用Socket和IO流实现文件的上传与下载

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍了Java怎么利用Socket和IO流实现文件的上传与下载的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么利用Socket和IO流实现文件的上传
千家信息网最后更新 2025年02月01日Java怎么利用Socket和IO流实现文件的上传与下载

这篇文章主要介绍了Java怎么利用Socket和IO流实现文件的上传与下载的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java怎么利用Socket和IO流实现文件的上传与下载文章都会有所收获,下面我们一起来看看吧。

核心技术

  • 1、TCP

  • 2、Socket

  • 3、FileInputStream与FileOutputStream

  • 4、DataInputStream与DataOutputStream

  • 5、多线程

Config

package com.io14;/** * 本文作者:谷哥的小弟  * 博客地址:http://blog.csdn.net/lfdfhl */public class Config {        public static final String ip = "localhost";        public static final int port = 10088;}

Client

package com.io14;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import java.net.Socket;/** * 本文作者:谷哥的小弟  * 博客地址:http://blog.csdn.net/lfdfhl */public class Client {        public static void main(String arg[]) {                testDownload();        }        public static void testUpload() {                String filePath = "D:" + File.separator + "beauty.jpg";                Client client = new Client();                client.uploadFile(filePath);        }        public static void testDownload() {                Client client = new Client();                client.downloadFile();        }        public void uploadFile(String filePath) {                try {                        // 创建待上传文件对象                        File file = new File(filePath);                        String fileName = file.getName();                        long fileLength = file.length();                        System.out.println("客户端待上传文件:" + fileName + ",其大小为:" + fileLength);                        // 创建FileInputStream                        FileInputStream fileInputStream = new FileInputStream(filePath);                        // 创建Socket对象                        Socket socket = new Socket(Config.ip, Config.port);                        // 从Socket获取OutputStream                        OutputStream outputStream = socket.getOutputStream();                        // 创建DataOutputStream                        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);                        // 利用DataOutputStream写出文件名和文件大小                        dataOutputStream.writeUTF(fileName);                        dataOutputStream.writeLong(fileLength);                        dataOutputStream.flush();                        // IO流读写操作                        byte[] buf = new byte[1024 * 1];                        int len = 0;                        while ((len = fileInputStream.read(buf)) != -1) {                                dataOutputStream.write(buf, 0, len);                        }                        // 释放资源                        dataOutputStream.flush();                        fileInputStream.close();                        socket.close();                } catch (Exception e) {                        System.out.println(e.toString());                }        }        public void downloadFile() {                try {                        // 创建Socket对象                        Socket socket = new Socket(Config.ip, Config.port);                        // 从Socket获取InputStream                        InputStream inputStream = socket.getInputStream();                        // 创建DataInputStream对象                        DataInputStream dataInputStream = new DataInputStream(inputStream);                        // 获取下载文件的文件名和文件大小                        String fileName = dataInputStream.readUTF();                        long fileLength = dataInputStream.readLong();                        System.out.println("客户端下载文件:" + fileName + ",其大小为:" + fileLength);                        // 组拼文件保存路径                        String fileDir = "D:";                        String filePath = fileDir + File.separator + fileName;                        // 创建FileOutputStream对象                        FileOutputStream fileOutputStream = new FileOutputStream(filePath);                        // IO流读写操作                        byte[] buf = new byte[1024 * 1];                        int len = 0;                        while ((len = dataInputStream.read(buf)) != -1) {                                fileOutputStream.write(buf, 0, len);                        }                        // 释放资源                        fileOutputStream.flush();                        fileOutputStream.close();                        dataInputStream.close();                        socket.close();                } catch (Exception e) {                        System.out.println(e.toString());                }        }}

Server

package com.io14;import java.net.ServerSocket;import java.net.Socket;/** * 本文作者:谷哥的小弟  * 博客地址:http://blog.csdn.net/lfdfhl */public class Server {        public static void main(String arg[]) {                testDownload();        }                public static void testUpload() {                Server server = new Server();                server.handleUploadFile();        }                public static void testDownload() {                Server server = new Server();                server.handleDownloadFile();        }        public void handleUploadFile() {                try {                        // 创建ServerSocket对象                        ServerSocket serverSocket = new ServerSocket(Config.port);                        while (true) {                                // 接收客户端连接请求                                Socket socket = serverSocket.accept();                                // 开启子线程处理文件上传                                UploadRunnableImpl uploadRunnableImpl = new UploadRunnableImpl(socket);                                Thread thread = new Thread(uploadRunnableImpl);                                thread.start();                        }                } catch (Exception e) {                        System.out.println(e.toString());                }        }        public void handleDownloadFile() {                try {                        // 创建ServerSocket对象                        ServerSocket serverSocket = new ServerSocket(Config.port);                        while (true) {                                // 接收客户端连接请求                                Socket socket = serverSocket.accept();                                // 开启子线程处理文件下载                                DownloadRunnableImpl downloadRunnableImpl = new DownloadRunnableImpl(socket);                                Thread thread = new Thread(downloadRunnableImpl);                                thread.start();                        }                } catch (Exception e) {                        System.out.println(e.toString());                }        }}

UploadRunnableImpl

package com.io14;import java.io.DataInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.net.Socket;/** * 本文作者:谷哥的小弟  * 博客地址:http://blog.csdn.net/lfdfhl */public class UploadRunnableImpl implements Runnable {        private Socket socket;                public UploadRunnableImpl(Socket socket) {                this.socket = socket;        }        @Override        public void run() {                try {                        // 从Socket获取InputStream                        InputStream inputStream = socket.getInputStream();                        // 创建DataInputStream对象                        DataInputStream dataInputStream = new DataInputStream(inputStream);                                                // 获取上传文件的文件名和文件大小                        String fileName = dataInputStream.readUTF();                        long fileLength = dataInputStream.readLong();                        System.out.println("服务端接收上传文件:"+fileName+",其大小为:"+fileLength);                                                // 组拼文件保存路径                        String fileDir = "E:";                        String filePath= fileDir + File.separator+fileName;                                                // 创建FileOutputStream对象                        FileOutputStream fileOutputStream = new FileOutputStream(filePath);                                                // IO流读写操作                        byte[] buf = new byte[1024*1];                        int len = 0;                        while ((len = dataInputStream.read(buf)) != -1) {                                fileOutputStream.write(buf, 0, len);                        }                                                // 释放资源                        fileOutputStream.flush();                        fileOutputStream.close();                        dataInputStream.close();                        socket.close();                } catch (Exception e) {                        System.out.println(e.toString());                }        }}

DownloadRunnableImpl

package com.io14;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.OutputStream;import java.net.Socket;/** * 本文作者:谷哥的小弟  * 博客地址:http://blog.csdn.net/lfdfhl */public class DownloadRunnableImpl implements Runnable{        private Socket socket;                public DownloadRunnableImpl(Socket socket) {                this.socket = socket;        }        @Override        public void run() {                try {                        // 创建待下载文件对象                        String filePath = "E:"+File.separator+"beauty.jpg";                        File file = new File(filePath);                        String fileName = file.getName();                        long fileLength = file.length();                        System.out.println("服务端待下载文件:" + fileName + ",其大小为:" + fileLength);                        // 创建FileInputStream                        FileInputStream fileInputStream = new FileInputStream(filePath);                        // 从Socket获取OutputStream                        OutputStream outputStream = socket.getOutputStream();                        // 创建DataOutputStream                        DataOutputStream dataOutputStream = new DataOutputStream(outputStream);                        // 利用DataOutputStream写出文件名和文件大小                        dataOutputStream.writeUTF(fileName);                        dataOutputStream.writeLong(fileLength);                        dataOutputStream.flush();                        // IO流读写操作                        byte[] buf = new byte[1024 * 1];                        int len = 0;                        while ((len = fileInputStream.read(buf)) != -1) {                                dataOutputStream.write(buf, 0, len);                        }                        // 释放资源                        dataOutputStream.flush();                        fileInputStream.close();                        socket.close();                } catch (Exception e) {                        System.out.println(e.toString());                }        }}

关于"Java怎么利用Socket和IO流实现文件的上传与下载"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Java怎么利用Socket和IO流实现文件的上传与下载"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

0