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

目录
  • 背景概述
  • 核心技术
    • Config
    • Client
    • Server
    • UploadRunnableImpl
    • DownloadRunnableImpl

背景概述

本文利用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 文件上传与下载内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaWeb实现文件上传下载功能实例详解

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 文件上传概述 1.文件上传的作用 例如网络硬盘!就是用来上传下载文件的. 在智联招聘上填写一个完整的简历还需要上传照片呢. 2.文件上传对页面的要求 上传文件的要求比较多,需要记一下: 必须使用表单,而不能是超链接 表单的method必须是POST,而不能是GET 表单的enctype必须是multipart/form-data 在表单中添加file表单字段,即<input ty

  • Java中实现文件上传下载的三种解决方案(推荐)

    java文件上传与文件下载是程序开发中比较常见的功能,下面通过本文给大家介绍Java中实现文件上传下载的三种解决方案,具体详情如下所示: 第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null; String fileAddre="/numUp"; try { InputStream stream = file.getInputStream(

  • java实现FTP文件上传与文件下载

    本文实例为大家分享了两种java实现FTP文件上传下载的方式,供大家参考,具体内容如下 第一种方式: package com.cloudpower.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import sun.net.TelnetInputStream; import sun.net.TelnetO

  • java实现文件上传下载和图片压缩代码示例

    分享一个在项目中用的到文件上传下载和对图片的压缩,直接从项目中扒出来的:) 复制代码 代码如下: package com.eabax.plugin.yundada.utils; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.

  • JAVA中使用FTPClient实现文件上传下载实例代码

    在java程序开发中,ftp用的比较多,经常打交道,比如说向FTP服务器上传文件.下载文件,本文给大家介绍如何利用jakarta commons中的FTPClient(在commons-net包中)实现上传下载文件. 一.上传文件 原理就不介绍了,大家直接看代码吧 /** * Description: 向FTP服务器上传文件 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保(cuihongbao@d-heaven.com)创建 * @param url F

  • JavaWeb实现文件上传下载功能实例解析

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

  • JavaEE实现前后台交互的文件上传与下载

    首先为大家介绍相关的技术: service方法中的两个重要参数. ServletRequest – 用接收用户的请求,它的作用是: 可获取请求头信息. 可设置请请求的字符编码. 可获得用户传递的参数.Post或get. 可获取远程(即访问者)的IP地址. 可获取输入流,如用户上传文件.相片等. 它的一个子接口:javax.servlet.http.HttpServletRequest ServletResponse – 用于向用户返回数据. 设置响应类型- contentType 设置编码-se

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

    目录 背景概述 核心技术 Config Client Server UploadRunnableImpl DownloadRunnableImpl 背景概述 本文利用Socket编程和IO流技术实现文件的上传与下载. 核心技术 1.TCP 2.Socket 3.FileInputStream与FileOutputStream 4.DataInputStream与DataOutputStream 5.多线程 Config package com.io14; /** * 本文作者:谷哥的小弟 * 博

  • Java使用Sftp和Ftp实现对文件的上传和下载

    sftp和ftp两种方式区别,还不清楚的,请自行百度查询,此处不多赘述.完整代码地址在结尾!! 第一步,导入maven依赖 <!-- FTP依赖包 --> <dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version> </dependency> <!

  • java eclipse 中文件的上传和下载示例解析

    文件的上传与下载(一) 在实现文件上传和下载之前我们需要做一些准备工作,在Apache官网去下载文件上传下载的两个组件,下载链接这里给出:common-fileupload组件下载:http://commons.apache.org/proper/commons-fileupload/ common-io组件下载:http://commons.apache.org/proper/commons-io/根据自己需求下载对应版本 一.创建工程 将所需要的两个开发包导入到工程项目中如图: 二.代码编写

  • Java实现FTP文件的上传和下载功能的实例代码

    FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制文件的双向传输.同时,它也是一个应用程序(Application).基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件.在FTP的使用当中,用户经常遇到两个概念:"下载"(Download)和"上传"(Upload)."下载"文件就是从远程主机拷贝文件至自己

  • SpringMVC实现文件的上传和下载实例代码

    前些天一位江苏经贸的学弟跟我留言问了我这样一个问题:"用什么技术来实现一般网页上文件的上传和下载?是框架还是Java中的IO流".我回复他说:"使用SpringMVC框架可以做到这一点,因为SpringMVC为文件的上传提供了直接的支持,但需要依赖Apache提供Commons FileUpload组件jar包."鉴于这个问题,我上网也百度了一下,网上很多都是介绍的使用IO流来实现文件的上传和下载,也有说到框架的,但介绍的并不是很完整,今天小钱将和大家介绍使用Spr

  • JavaWeb实现文件的上传与下载

    JavaWeb实现文件的上传与下载,供大家参考,具体内容如下 第一步:导包 导入commons-fileupload-1.3.3.jar和commons-io-2.4.jar两个依赖包 第二步:编写前端页面 1.提交页面 index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ tagl

  • Spring Boot使用GridFS实现文件的上传和下载方式

    目录 使用GridFS实现文件的上传和下载 首先了解一下怎么用命令操作GridFS 使用Spring Boot操作GridFS Spring Boot中使用GridFS 什么是GridFS 在SpringBoot中使用GridFS 使用GridFS实现文件的上传和下载 在这篇博客中,我们将展示如何使用Spring Boot中使用mongodb自带的文件存储系统GridFS实现文件的上传和下载功能 首先了解一下怎么用命令操作GridFS 安装mongodb sudo apt-get install

  • Android Http实现文件的上传和下载

    最近做一个项目,其中涉及到文件的上传和下载功能,大家都知道,这个功能实现其实已经烂大街了,遂.直接从网上荡了一堆代码用,结果,发现网上的代码真是良莠不齐,不是写的不全面,就是有问题,于是自己重新整理了一番,把它们发出来,希望更多人能受用. 文件上传 通过org.apache.commons.httpclient.HttpClient来实现文件上传,该jar包可以直接从网上所搜.下载. /** * @param mContext 上下文 * @param targetUrl 文件上传地址 * @p

  • JavaWeb 文件的上传和下载功能简单实现代码

    一.文件的上传和下载 1.文件上传的原理分析 1.文件上传的必要前提: a.提供form表单,method必须是post           b.form表单的enctype必须是multipart/form-data           c.提供input type="file"类的上传输入域 2.enctype属性 作用:告知服务器请求正文的MIME类型(请求消息头:Content-Type作用是一致的)      可选值: application/x-www-form-urlen

  • Servlet实现文件的上传与下载

    前言: 文件的上传和下载在日常开发中很是常见,那么这一功能是如何实现的呢,下面我给大家介绍一下 实现条件: 1.需要一个form标签,method为post请求 2.form的encType属性值为multipart/form-data 3.input标签的type=file 4.需要的jar包() 工程目录: 具体实现: UploadServlet.java(上传) import org.apache.commons.fileupload.FileItem; import org.apache

随机推荐