目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用TCP协议来实现。

TCP通信需要创建一个服务器端程序和一个客户端程序,实现客户端向服务器端上传文件

代码实例:

l 首先编写服务器端程序,用来接收图片。

  1. //服务器端
  2. public class TCPServer {
  3. public static void main(String[] args) throws IOException {
  4. //明确端口号
  5. ServerSocket server=new ServerSocket(9999);
  6. //建立连接
  7. Socket socket=server.accept();
  8. //显示哪个客户端Socket连接上了服务器
  9. InetAddress ipObject = server.getInetAddress();//得到IP地址对象
  10. String ip = ipObject.getHostAddress(); //得到IP地址字符串
  11. System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
  12. //明确数据源,获取Socket的输入流
  13. InputStream in=socket.getInputStream();
  14. //明确目的地
  15. File file=new File("e:\\haizei");
  16. //判断文件是否存在
  17. if(!file.exists()){
  18. file.mkdirs();
  19. }
  20. //创建接收文件名称(避免重复):域名+毫秒值+3位随机数
  21. String filename="oracle"+System.currentTimeMillis()+(Math.random()*9+1)*100+".jpg";
  22. FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
  23. //开始复制
  24. int len=0;
  25. byte[] bytes=new byte[1024];
  26. while((len=in.read(bytes))!=-1){
  27. fos.write(bytes, 0, len);
  28. }
  29. //回复客户端
  30. OutputStream out=socket.getOutputStream();
  31. out.write("上传成功".getBytes());
  32. //释放资源
  33. fos.close();
  34. server.close();
  35.  
  36. }
  37. }

l 编写客户端,完成上传图片

  1. //客户端
  2. public class TCPClient {
  3. public static void main(String[] args) throws IOException {
  4. Socket socket=new Socket("127.0.0.1",8000);
  5. OutputStream out=socket.getOutputStream();
  6. FileInputStream fis=new FileInputStream("d:\\haizei.jpg");
  7. int len=0;
  8. byte[] bytes=new byte[1024];
  9. while ((len=fis.read(bytes))!=-1) {
  10. out.write(bytes,0,len);
  11.  
  12. }
  13. //传输的是字符数组,没有结束符,不能读取-1,要添加结束方法
  14. //告诉服务器端,不要再读了,到末尾了
  15. socket.shutdownOutput();
  16. //服务器回复
  17. InputStream in=socket.getInputStream();
  18. len=in.read(bytes);
  19. System.out.println(new String(bytes,0,len));
  20. //释放资源
  21. fis.close();
  22. socket.close();
  23. }
  24. }

文件上传案例多线程版本

实现服务器端可以同时接收多个客户端上传的文件。

l 我们要修改服务器端代码

  1. public class UPload implements Runnable{
  2. private Socket socket;
  3.  
  4. public UPload(Socket socket){
  5. this.socket=socket;
  6. }
  7. public void run() {
  8. FileOutputStream fos=null;
  9. try{
  10. InetAddress ipObject = socket.getInetAddress();//得到IP地址对象
  11. String ip = ipObject.getHostAddress(); //得到IP地址字符串
  12. System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
  13. //明确数据源
  14. InputStream in=socket.getInputStream();
  15. //明确目的地
  16. File file=new File("e:\\haizei");
  17. //判断文件是否存在
  18. if(!file.exists()){
  19. file.mkdirs();
  20. }
  21. //域名+毫秒值+6位随机数
  22. String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999)+".jpg";
  23. fos=new FileOutputStream(file+File.separator+filename);
  24. //开始复制
  25. int len=0;
  26. byte[] bytes=new byte[1024];
  27. while((len=in.read(bytes))!=-1){
  28. fos.write(bytes, 0, len);
  29. }
  30. //回复客户端
  31. OutputStream out=socket.getOutputStream();
  32. out.write("上传成功".getBytes());
  33. }catch(IOException ex){
  34. ex.printStackTrace();
  35. }finally{
  36. //释放资源
  37. try {
  38. fos.close();
  39. } catch (IOException e) {
  40. // TODO Auto-generated catch block
  41. e.printStackTrace();
  42. }
  43. }

创建实验类

  1. public class Demo {
  2. public static void main(String[] args) throws IOException {
  3. //明确端口号
  4. ServerSocket server =new ServerSocket(8000);
  5. //死循环,不断创建线程
  6. while(true){
  7. //接收客户端
  8. Socket socket=server.accept();
  9. //匿名对象,创建线程
  10. new Thread(new UPload(socket)).start();
  11. }
  12. }
  13. }

TCP通信---文件上传案例、多线程文件上传的更多相关文章

  1. java TCP通信 socket 套接字 用图片上传轰炸服务器

    客户端 package com.swift.jinji; import java.io.FileInputStream; import java.io.IOException; import java ...

  2. [C语言]一个很实用的服务端和客户端进行TCP通信的实例

    本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...

  3. java 网络编程之TCP通信和简单的文件上传功能

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)

    1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...

  5. Java实现一个简单的文件上传案例

    Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...

  6. Springboot第三篇:与前端fetch通信(关于前端传输json数据上传文件等等前后端的处理)

    关于前端接口传递的方法,推荐按以下使用: 若要在服务器上创建资源,推荐使用POST方法 若要检索某个资源,推荐使用GET方法 若要更新资源,推荐使用PUT方法 若要删除某个资源,推荐使用DELETE方 ...

  7. 超实用文件监控多线程FTP上传工具

    这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...

  8. 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组

    马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...

  9. 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_5_综合案例_文件上传案例优化

    自定义文件命名 文件名称被写死了 服务器上传了一张图片,服务器就停止了 把服务器端的代码放在while循环里面 服务器也不用 关闭了. 上传完成后服务器端没有关闭 再来启动客户端,又上传一张投片. 多 ...

随机推荐

  1. React-Native WebView使用本地js,css渲染html

    前言 最近在使用React-Native开发一个App,遇见一个问题,Webview组件根据url来加载页面,但是这样导致的一个问题页面加载的时间有点长,我想优化一下,因为页面只要是一些内容展示,我想 ...

  2. eclipse在debug模式下鼠标移动到变量上不显示值的问题

    在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的: Window->Preferences->Java->Editor-> ...

  3. ORACLE误删除表数据或误更新/插入数据如何恢复

    工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料   PL/SQL 方法/步骤     首先新建一张测试表TEST,里面输入记录.由于删除/更 ...

  4. ASP.NET MVC 四种Controller向View传值方法

    控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...

  5. 一.5.序列化应用之服务器制造厂与型号app功能

    1.环境准备: (python36env) [vagrant@CentOS7 apps]$ django-admin startapp manufacturer (1)激活:'manufacturer ...

  6. python抓取头条文章

    python抓取头条美文并存储到mongodb # Author:song from multiprocessing import Pool from urllib.parse import urle ...

  7. 手写一个Redux,深入理解其原理

    Redux可是一个大名鼎鼎的库,很多地方都在用,我也用了几年了,今天这篇文章就是自己来实现一个Redux,以便于深入理解他的原理.我们还是老套路,从基本的用法入手,然后自己实现一个Redux来替代源码 ...

  8. 转载------一小时包教会 —— webpack 入门指南

    本文写的蛮好,转载地址:http://www.w2bc.com/Article/50764 其他的地址: http://webpack.github.io/docs/usage-with-gulp.h ...

  9. (四)ansible 通过堡垒机访问内网服务器

    场景:     在ansible的使用过程中,存在这样的场景,ansible所在的管理节点与被管理的机器需要 通过一个跳板机才能连接,无法直接连接.要解决这个问题,并不需要在 ansible里做什么处 ...

  10. TJOI2013 奖学金—大根堆实现(洛谷P3963)

    奖学金 题目描述 小张学院有 \(c\) 名学生,第 \(i\) 名学生的成绩为 \(ai\) ​,要获得的奖学金金额为 \(bi\) . 要从这 \(c\) 名学生中挑出 \(n\) 名学生发奖学金 ...