目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用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. js语法基础入门(2)

    2.变量 2.1.变量的声明 声明变量的时候没有赋值,默认输出undefined //通过var 声明一个变量 var user: //默认输出undefined 可以同时声明多个变量 var use ...

  2. QUIC/HTTP3 协议简析

    从 HTTP 的进化历史讲起,细说使用协议的变迁,了解原因发现问题,解码 QUIC 在 HTTP3 中的支撑作用,共同探讨 HTTP3 的未来. HTTP.HTTP2 和 HTTP3 先和大家来回顾一 ...

  3. mybatis源码配置文件解析之四:解析plugins标签

    在前边的博客在分析了mybatis解析typeAliases标签,<mybatis源码配置文件解析之三:解析typeAliases标签>.下面来看解析plugins标签的过程. 一.概述 ...

  4. max depth exceeded when dereferencing c0-param0的问题

    在做项目的时候,用到了dwr,有一次居然报错,错误是max depth exceeded when dereferencing c0-param0 上网查了一下,我居然传参数的时候传的是object类 ...

  5. spring boot 整合Thymeleaf模板

    SpringBoot 是为了简化 Spring 应用的创建.运行.调试.部署等一系列问题而诞生的产物,自动装配的特性让我们可以更好的关注业务本身而不是外部的XML配置,我们只需遵循规范,引入相关的依赖 ...

  6. css定位方式有哪几种?

    复杂的网页布局都是通过各种网页元素灵活定位实现的,网页中的各种元素定位都有自己的特点.下面我们来看一下css的几种定位方式. float定位(即浮动定位): 这种定位方式很简单,只需规定一个浮动的方向 ...

  7. 逻辑式编程语言极简实现(使用C#) - 4. 代码实现(完结)

    本文是本系列的完结篇.本系列前面的文章: 逻辑式编程语言极简实现(使用C#) - 1. 逻辑式编程语言介绍 逻辑式编程语言极简实现(使用C#) - 2. 一道逻辑题:谁是凶手 逻辑式编程语言极简实现( ...

  8. Buy A Ticket(图论)

    Buy A Ticket 题目大意 每个点有一个点权,每个边有一个边权,求对于每个点u的\(min(2*d(u,v)+val[v])\)(v可以等于u) solution 想到了之前的虚点,方便统计终 ...

  9. The Meaningless Game,算是思维吧。

    题目直接链接 题意: 某游戏规则:每次选定数字k(正整数),两人初始分数为1,获胜者分数乘k2,失败者分数成k,给你两个数字,判断是否可能是本游戏的两人的得分. 分析: 为啥题意我不写判断两个数可不可 ...

  10. 【华为云技术分享】跟唐老师学习云网络 : Kubernetes网络实现

    当今K8s独霸天下之时,咱们站在更高的角度,好好的看看K8s网络是以什么理念构筑的.以及一个容器集群的好保姆,是如何分别照顾 南北流量和东西流量的. 一.简单介绍下Kubernetes 略..容器集群 ...