TCP通信---文件上传案例、多线程文件上传
目前大多数服务器都会提供文件上传的功能,由于文件上传需要数据的安全性和完整性,很明显需要使用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通信---文件上传案例、多线程文件上传的更多相关文章
- java TCP通信 socket 套接字 用图片上传轰炸服务器
客户端 package com.swift.jinji; import java.io.FileInputStream; import java.io.IOException; import java ...
- [C语言]一个很实用的服务端和客户端进行TCP通信的实例
本文给出一个很实用的服务端和客户端进行TCP通信的小例子.具体实现上非常简单,只是平时编写类似程序,具体步骤经常忘记,还要总是查,暂且将其记下来,方便以后参考. (1)客户端程序,编写一个文件clie ...
- java 网络编程之TCP通信和简单的文件上传功能
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- 艺萌文件上传下载及自动更新系统(基于networkComms开源TCP通信框架)
1.艺萌文件上传下载及自动更新系统,基于Winform技术,采用CS架构,开发工具为vs2010,.net2.0版本(可以很容易升级为3.5和4.0版本)开发语言c#. 本系统主要帮助客户学习基于TC ...
- Java实现一个简单的文件上传案例
Java实现一个简单的文件上传案例 实现流程: 1.客户端从硬盘读取文件数据到程序中 2.客户端输出流,写出文件到服务端 3.服务端输出流,读取文件数据到服务端中 4.输出流,写出文件数据到服务器硬盘 ...
- Springboot第三篇:与前端fetch通信(关于前端传输json数据上传文件等等前后端的处理)
关于前端接口传递的方法,推荐按以下使用: 若要在服务器上创建资源,推荐使用POST方法 若要检索某个资源,推荐使用GET方法 若要更新资源,推荐使用PUT方法 若要删除某个资源,推荐使用DELETE方 ...
- 超实用文件监控多线程FTP上传工具
这是自己很久以前写的一个多线程FTP 上传工具,支持多账户,自定义线程数,自定义文件监控目录,可用做文件发布使用,非常实用,今天有小伙伴问起,现分享出来: using System; using Sy ...
- 前端通信:ajax设计方案(四)--- 集成ajax上传技术 大文件/超大文件前端切割上传,后端进行重组
马上要过年了,哎,回家的心情也特别的激烈.有钱没钱,回家过年,家永远是舔舐伤口最好的地方.新的一年继续加油努力. 上次做了前端的ajax的上传文件技术,支持单文件,多文件上传,并对文件的格式和大小进行 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_07-网络编程_第3节 综合案例_文件上传_5_综合案例_文件上传案例优化
自定义文件命名 文件名称被写死了 服务器上传了一张图片,服务器就停止了 把服务器端的代码放在while循环里面 服务器也不用 关闭了. 上传完成后服务器端没有关闭 再来启动客户端,又上传一张投片. 多 ...
随机推荐
- 安装pymysql模块及使用
安装pymysql模块: https://www.cnblogs.com/Eva-J/articles/9772614.html file--settings for New Projects---P ...
- Centos 6.4 安装KSnapshot 和gimp截图工具
一. # wget http://www.ibiblio.org/pub/Linux/X11/xutils/ksnapshot-0.2.7.tar.gz # tar -zxvf ksnapshot-0 ...
- Spring Boot中的事务是如何实现的
本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天呢!灯塔君跟大家讲: Spring Boot中的事务是如何实现的 1. 概述 一直在用SpringBoot中的@Transactional来做事 ...
- 每日一题 - 剑指 Offer 30. 包含min函数的栈
题目信息 时间: 2019-06-24 题目链接:Leetcode tag:栈 难易程度:简单 题目描述: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 m ...
- h5手机摇一摇功能实现:基于html5重力感应DeviceMotionEvent事件监听手机摇晃
DeviceMotionEven是html5提供的一个用来获取设备物理方向及运动的信息(比如陀螺仪.罗盘及加速计)的Dom事件,事件描述如下: deviceorientation:提供设备的物理方向信 ...
- 平常我们是如何区分css中class和id之间有什么区别的?
我们平常在用DIV+CSS制作html网页页面时,常会用到class 和id来选择调用CSS样式属性.对学习CSS的新手来说class和id可能比较模糊,同时不知道什么时候该用class,什么时候又用 ...
- python爬京东(带GUI)
最近写了个专门爬百度的,后来又想爬京东的,还是采用上次的BeautifulSoup+requests模块 下面直接上代码,看不懂的可以看这篇文章或者注释来学习 #!/usr/bin/env pytho ...
- python数据处理(六)之数据清洗:标准化和脚本化
1.数据归一化和标准化 a. 归一化:对数据集进行计算,使数据都位于一个特定的范围\ b.标准化: c.删除离群值 2.数据存储 a.保存到SQLite数据库中 b.导出到简单的文件中csv 3.找到 ...
- 数据可视化之DAX篇(十)在PowerBI中累计求和的两种方式
https://zhuanlan.zhihu.com/p/64418286 假设有一组数据, 已知每一个产品贡献的利润,如果要计算前几名产品的贡献利润总和,或者每一个产品和利润更高产品的累计贡献占总体 ...
- 临时解决GitHub的raw.githubusercontent.com无法连接问题
http://qjzd.net:3000/topic/5e48cc33dcf06d6a181ffb81 查询真实IP 通过IPAddress.com首页,输入raw.githubusercontent ...