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循环里面 服务器也不用 关闭了. 上传完成后服务器端没有关闭 再来启动客户端,又上传一张投片. 多 ...
随机推荐
- React-Native WebView使用本地js,css渲染html
前言 最近在使用React-Native开发一个App,遇见一个问题,Webview组件根据url来加载页面,但是这样导致的一个问题页面加载的时间有点长,我想优化一下,因为页面只要是一些内容展示,我想 ...
- eclipse在debug模式下鼠标移动到变量上不显示值的问题
在eclipse中调试时,鼠标移动到变量上不显示值,使用ctrl+shift+i,或者通过配置达到目的: Window->Preferences->Java->Editor-> ...
- ORACLE误删除表数据或误更新/插入数据如何恢复
工作中一不小心将本不该删除/更新/插入的数据进行删除/更新/插入了,这时候一定要尽快进行恢复. 工具/原料 PL/SQL 方法/步骤 首先新建一张测试表TEST,里面输入记录.由于删除/更 ...
- ASP.NET MVC 四种Controller向View传值方法
控制器: // Get: Data public ActionResult Index() { //ViewData 方式 ViewData["UserName"] = " ...
- 一.5.序列化应用之服务器制造厂与型号app功能
1.环境准备: (python36env) [vagrant@CentOS7 apps]$ django-admin startapp manufacturer (1)激活:'manufacturer ...
- python抓取头条文章
python抓取头条美文并存储到mongodb # Author:song from multiprocessing import Pool from urllib.parse import urle ...
- 手写一个Redux,深入理解其原理
Redux可是一个大名鼎鼎的库,很多地方都在用,我也用了几年了,今天这篇文章就是自己来实现一个Redux,以便于深入理解他的原理.我们还是老套路,从基本的用法入手,然后自己实现一个Redux来替代源码 ...
- 转载------一小时包教会 —— webpack 入门指南
本文写的蛮好,转载地址:http://www.w2bc.com/Article/50764 其他的地址: http://webpack.github.io/docs/usage-with-gulp.h ...
- (四)ansible 通过堡垒机访问内网服务器
场景: 在ansible的使用过程中,存在这样的场景,ansible所在的管理节点与被管理的机器需要 通过一个跳板机才能连接,无法直接连接.要解决这个问题,并不需要在 ansible里做什么处 ...
- TJOI2013 奖学金—大根堆实现(洛谷P3963)
奖学金 题目描述 小张学院有 \(c\) 名学生,第 \(i\) 名学生的成绩为 \(ai\) ,要获得的奖学金金额为 \(bi\) . 要从这 \(c\) 名学生中挑出 \(n\) 名学生发奖学金 ...