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

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

代码实例:

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

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

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

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

文件上传案例多线程版本

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

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

public class UPload implements Runnable{
private Socket socket; public UPload(Socket socket){
this.socket=socket;
}
public void run() {
FileOutputStream fos=null;
try{
InetAddress ipObject = socket.getInetAddress();//得到IP地址对象
String ip = ipObject.getHostAddress(); //得到IP地址字符串
System.out.println("小样,抓到你了,连接我!!" + "IP:" + ip);
//明确数据源
InputStream in=socket.getInputStream();
//明确目的地
File file=new File("e:\\haizei");
//判断文件是否存在
if(!file.exists()){
file.mkdirs();
}
//域名+毫秒值+6位随机数
String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999)+".jpg";
fos=new FileOutputStream(file+File.separator+filename);
//开始复制
int len=0;
byte[] bytes=new byte[1024];
while((len=in.read(bytes))!=-1){
fos.write(bytes, 0, len);
}
//回复客户端
OutputStream out=socket.getOutputStream();
out.write("上传成功".getBytes());
}catch(IOException ex){
ex.printStackTrace();
}finally{
//释放资源
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

创建实验类

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

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. C# 接口(interface) 抽象类(abstract)

    类代码: interface Employee { void ShowEmp(); } abstract class EmployeeInPostion: Employee { public abst ...

  2. Redis系列(八):数据结构List双向链表中阻塞版本之BLPOP、BRPOP和LINDEX、LINSERT、LRANGE命令详解

    1.BRPOP.BLPOP BLPOP: BLPOP 是阻塞式列表的弹出原语. 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞. 当给 ...

  3. 消息总线(Bus)

    Spring Cloud Bus将分布式系统的节点与轻量级消息代理链接.可以用于通知状态更改(例如配置更改)或其他管理指令.一个关键的地方是,Bus就像一个分布式执行器,用于扩展的Spring Boo ...

  4. JVM源码分析之深入分析Object类finalize()方法的实现原理

      原创申明:本文由公众号[猿灯塔]原创,转载请说明出处标注 ​“365篇原创计划”第十篇. 今天呢!灯塔君跟大家讲: 深入分析Object类finalize()方法的实现原理 finalize 如果 ...

  5. grunt之easy demo

    首先安装grunt-cli cnpm install -g grunt-cli 接下来创建package.json,内容如下 {        "name": "demo ...

  6. vue 3.0 体验,vue 3.0新特性

    前言 昨天不是尤雨溪 不是刚在B站 直播玩了,分享了vue-next v3.0.0-beta.1 版本 哈哈, 不要太刺激哦 6大亮点 Performance:性能更比Vue 2.0强. Tree s ...

  7. 洛谷P2566 [SCOI2009]围豆豆(状压dp+spfa)

    题目传送门 题解 Σ(っ °Д °;)っ 前置知识 射线法:从一点向右(其实哪边都行)水平引一条射线,若射线与路径的交点为偶数,则点不被包含,若为奇数,则被包含.(但注意存在射线与路径重合的情况) 这 ...

  8. 重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 黎明前的坚守,的住吗? 有人举过这样一个例子,先给你张北大的录 ...

  9. .NET Core使用AngleSharp网络数据采集

    环境: vs2019 .net core 3.1 angleSharp winform 安装:angleSharp 有这么一本Python的书: <<Python 网络数据采集>&g ...

  10. WPF中国地图

    实现鼠标移动到某个地区显示Popup弹框 1,地图 <Grid Margin="0,0,0,0" Grid.Row="1"> <Path St ...