文件的上传(TCP)

问题描述:将本地文件上传(需将文件名一起上传)至指定服务器,服务器将上传的文件保存至指定路径下并文件名添加前缀 "Downlod_原文件名"。

思路: 客户端需要一个输入流来读取本地文件内容和文件名;需要一个输出流将读取的文件名发送至服务器端,然后再将内容发送至服务器端。

    服务器端需要一个输入流读取文件名和内容,需要一个输出流将读取到的文件名添加前缀并将内容保存至指定路径即可;

客户端示例代码:

 1 package Datagram;
 2
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.OutputStream;
 6 import java.net.InetSocketAddress;
 7 import java.net.Socket;
 8
 9 /*
10  * 客户端上传本地文件和文件名至指定服务器上
11  */
12 public class FileUploadDemo {
13     public static void main(String[] args) throws Exception {
14         //创建客户端套接字对象
15         Socket s = new Socket();
16         //绑定发送的服务器地址和端口
17         InetSocketAddress isa = new InetSocketAddress("localhost", 8080);
18         //发起连接
19         s.connect(isa);
20         //获取输出流
21         OutputStream os= s.getOutputStream();
22         //查找指定文件
23         File file = new File("D:\\test.jpg");
24         //获取文件名
25         String fileName = file.getName();
26         //创建文件输入流
27         FileInputStream fis = new FileInputStream(file);
28         //写入文件长度(方便在服务端接收是需要知道传递的字节长度)
29         os.write(fileName.length());
30         //写入文件名
31         os.write(fileName.getBytes());
32         //读取指定文件内容
33         int len = -1;
34         byte[] by = new byte[1024];
35         while((len=fis.read(by))!=-1){
36             //将文件内容写入输出流中
37             os.write(by,0,len);
38         }
39         //禁掉输出流
40         s.shutdownOutput();
41         //关流
42         s.close();
43         fis.close();
44         os.close();
45
46     }
47 }

服务器端示例代码:

 1 package Datagram;
 2
 3 import java.io.FileOutputStream;
 4 import java.io.InputStream;
 5 import java.net.ServerSocket;
 6 import java.net.Socket;
 7
 8 /*
 9  * 服务器端接收客户端发送的文件并保存该文件
10  */
11 public class FileDownloadDemo {
12     public static void main(String[] args) throws Exception {
13         //创建服务端套接字对象
14         ServerSocket ss = new ServerSocket(8080);
15         //监听连接并接收连接
16         Socket s = ss.accept();
17         //获取输入流对象
18         InputStream is = s.getInputStream();
19         //对文件名的长度
20         int fileNameLength = is.read();
21         //按照读出的文件名的长度来存入字节数组
22         byte[] by = new byte[fileNameLength];
23         //按传递的文件名长度读取一次便得到的既是文件名
24         is.read(by);
25
26         String fileName = new String(by);
27         //创建输出流并更改输出的文件名
28         FileOutputStream fis = new FileOutputStream("D:\\Downlod_"+fileName);
29         //读取文件
30         int len =-1;
31         by = new byte[1024];
32         while((len=is.read(by))!=-1){
33             //将读取到的数据写入输出流
34             fis.write(by,0,len);
35         }
36         //禁掉输入流
37         s.shutdownInput();
38         //关流
39         fis.close();
40         is.close();
41
42     }
43 }
时间: 2024-12-29 23:24:14

文件的上传(TCP)的相关文章

Android中Socket大文件断点上传

什么是Socket? 所谓Socket通常也称作“套接字”,用于描述IP地址和端口,是一个通信连的句柄,应用程序通常通过“套接字”向网络发送请求或者应答网络请求,它就是网络通信过程中端点的抽象表示.它主要包括以下两个协议: TCP (Transmission Control Protocol 传输控制协议):传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据.TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功

使用HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

Android 文件断点上传器[多用户并发访问]

通过TCP/IP(SOCKET)协议实现文件断点上传(实现多用户并发访问). HTTP不支持文件断点续传,所以无法使用HTTP协议. 场景: 1. 网络不稳定,导致上传失败,下次不是从头开始,而是从断点开始上传: 2. 上传大文件,无法http上传,因为web服务器考虑到安全因素,会限制文件大小,一般10+m. 此文件断点上传器使用自定义协议. 服务器为上传的文件在服务器端生成唯一的sourceid关联上传文件,当客户端上传文件时,首次的sourceid为空,服务端先判断sourceid是否为空

HttpClient实现文件的上传下载

1 HTTP HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源. 虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活.HttpClient 用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议. 一般的情况下我们都是使用Chrome或者

黏包-黏包的成因、解决方式及struct模块初识、文件的上传和下载

黏包: 同时执行多条命令之后,得到的结果很可能只有一部分,在执行其他命令的时候又接收到之前执行的另外一部分结果,这种显现就是黏包. 只有TCP协议中才会产生黏包,UDP协议中不会有黏包(udp协议中数据会直接丢失,俗称丢包) #面试 #首先只有在TCP协议中才有黏包现象,是因为TCP协议是面向流的协议, #在发送的数据传输的过程中还有缓存机制来避免数据丢失 #因此在连续发送小数据的时候,以及接收大小不符的时候,都容易产生黏包现象 #本质是不知道客户端发送的数据长度 面试中解释黏包 #连续send

ESP8266 使用 SPIFFS 进行文件的上传与保存

首先需要下载包.网址https://github.com/esp8266/arduino-esp8266fs-plugin/releases  我下载的是最新的包. 下载下来之后是个jar包,需要放到arduino根目录的tools文件夹中. 不要放错位置.放错位置的话,你的arduino IDE是无法在工具栏看到这个的,切记.我一开始就是放错了位置,结果找不到 然后呢,你需要在项目里创建一个data文件夹.然后将需要上传到falsh中的文件放到这个目录中.然后点击上面Data Upload就可

iOS开发网络篇—文件的上传

iOS开发网络篇—文件的上传 说明:文件上传使用的时POST请求,通常把要上传的数据保存在请求体中.本文介绍如何不借助第三方框架实现iOS开发中得文件上传. 由于过程较为复杂,因此本文只贴出部分关键代码. 主控制器的关键代码: YYViewController.m 1 #import "YYViewController.h" 2 3 #define YYEncode(str) [str dataUsingEncoding:NSUTF8StringEncoding] 4 5 @inter

PHP文件的上传

<?php header('Content-type:text/html;charset=utf-8'); if(isset($_POST['submit'])){ //检测表单'submit'是否有上传,如果有上传继续下一步,如果没那就没反应 if(is_uploaded_file($_FILES['myfile']['tmp_name'])){ //检测指定文件是否通过HTTP POST上传的,如果是继续下一步,如果不是提示'可能有攻击!' $arr=pathinfo($_FILES['my

文件的上传

上传: 1). 表单需要注意的 3 点 2). Struts2 的文件上传实际上使用的是 Commons FileUpload 组件, 所以需要导入 commons-fileupload-1.3.jarcommons-io-2.0.1.jar 3). Struts2 进行文件上传需要使用 FileUpload 拦截器 4). 基本的文件的上传: 直接在 Action 中定义如下 3 个属性, 并提供对应的 getter 和 setter //文件对应的 File 对象private File [

【转】文件各种上传,离不开的表单

阅读目录 利用表单实现文件上传 表单异步上传(jquery.form插件) 模拟表单数据上传(FormData) 分片上传 使用HTML5 拖拽.粘贴上传 上传插件(WebUploader) 总结 作为程序员的我们,经常会要用到文件的上传和下载功能.到了需要用的时候,各种查资料.有木有..有木有....为了方便下次使用,这里来做个总结和备忘. 利用表单实现文件上传 最原始.最简单.最粗暴的文件上传. 前端代码: //方式1 <form action="/Home/SaveFile1&quo