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

    4.表单事件 表单事件处理主要用来验证表单,可以处理用户在表单上所做的任何操作. 4.1.onsubmit事件 当用户点击submit按钮来提交表单时,就会触发onsubmit事件,如果事件处理程序返 ...

  2. 如何白嫖微软Azure12个月及避坑指南

    Azure是微软提供的一个云服务平台.是全球除了AWS外最大的云服务提供商.Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务.这里的Azure是Azure国际不是 ...

  3. 「疫期集训day2」高地

    硝烟从凡尔登高地的东方升起...我只知道这里会发生世界上前所未有的一次战役------凡尔登的法军士兵 今天运气挺好,早自习刚复习完数论和二分图,考试时又复习了状压和Tarjan 于是乎成绩惨不忍睹 ...

  4. Django---进阶10

    目录 forms组件源码 cookie与session Cookie操作 session操作 CBV如何添加装饰器 作业 forms组件源码 """ 切入点: form_ ...

  5. [系列] Go - json.Unmarshal 遇到的小坑

    1.问题现象描述 使用 json.Unmarshal(),反序列化时,出现了科学计数法,参考代码如下: jsonStr := `{"number":1234567}` result ...

  6. Django13 /缓存、信号、django的读写分离

    Django13 /缓存.信号.django的读写分离 目录 Django13 /缓存.信号.django的读写分离 1. 缓存 2. 信号 3. django的读写分离 1. 缓存 缓存简述: 缓存 ...

  7. Flask 基础组件(九):请求扩展

    #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render_template app = ...

  8. 《你还在写sql语句吗?》人生苦短,进入MybatisPlus的丝滑体验

    一.发展历程 依稀记得大学期间,类中写sql语句的日子,一个sql语句占据了大部分时间,到后来hibernate的出现算是解决了这一痛点.工作 后,我们又接触到了mybatis这样的框架,瞬间感觉这个 ...

  9. easyui datagrid 中添加combobox

    项目需要,如下图所示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  10. 通过实现网站访问计数器带你理解 轻量级锁CAS原理,还学不会算我输!!!

    一.实现网站访问计数器 1.线程不安全的做法 1.1.代码 package com.chentongwei.concurrency; import static java.lang.Thread.sl ...