java网络编程之图片上传
输入输出流核心代码
所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中。
InputStream in = 输入源;
OutputStream os = 输出目的;
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes))!=-1){ //读取到文件末尾的话可以读到-1
os.write(bytes,0,len);
}
os.close();
in.close();
TCP图片上传客户端
1.Socket套接字连接服务器,指定ip和端口
Socket socket = Socket(String host, int port);
2.通过Socket获取字节输出流,向服务器写图片
OutputStream os = socket.getOutputStream();
3.创建输入流对象,读取图片数据源
FileInputStream fis = new FileInputStream(filePath);
4.读取图片,使用字节输出流,将图片写到服务器,采用字节数组进行缓冲
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1){
os.write(bytes,0,len);
}
socket.shutdownOutput();//文件读完时给服务器写终止序列
5.通过Socket套接字获取字节输入流,读取服务器发回来的上传成功
InputStream inputStream = socket.getInputStream();
len = inputStream.read(bytes);
System.out.println("服务器返回:"+new String(bytes,0,len));
6.关闭资源
socket.close();
/**
* 实现TCP图片上传客户端
* 实现步骤:
* 1.Socket套接字连接服务器,指定ip和端口
* Socket socket = Socket(String host, int port);
* 2.通过Socket获取字节输出流,写图片
* OutputStream os = socket.getOutputStream();
* 3.使用自己的流对象,读取图片数据源
* FileInputStream fis = new FileInputStream(filePath);
* 4.读取图片,使用字节输出流,将图片写到服务器,采用字节数组进行缓冲
* int len = 0;
* byte[] bytes = new byte[1024];
* while ((len = fis.read(bytes)) != -1){
* os.write(bytes,0,len);
* }
* 5.通过Socket套接字获取字节输入流,读取服务器发回来的上传成功
* InputStream inputStream = socket.getInputStream();
* len = inputStream.read(bytes);
* System.out.println("服务器返回:"+new String(bytes,0,len));
* 6.关闭资源
* socket.close();
*
* Created by Autumn on 2018/2/5.
*/
public class TCPClient {
public static void main(String[] args) throws IOException {
String ip = "127.0.0.1";
int port = 8000;
File fileFolder = new File("D:\\Users\\Autumn\\Pictures"); uploadPic(ip,port,fileFolder+File.separator+"tiger.jpg");
uploadPic(ip,port,fileFolder+File.separator+"water.jpg");
uploadPic(ip,port,fileFolder+File.separator+"sunset.jpg");
} /**
* 上传图片
* @param ip 服务器ip地址
* @param port 服务器端口号
* @param filePath 文件路径
* @throws IOException
*/
public static void uploadPic(String ip,int port,String filePath) throws IOException{
//创建客户端Socket
Socket socket = new Socket(ip,port);
//根据Socket获取字节输出流,用此流将图片写到服务器
OutputStream os = socket.getOutputStream(); //创建字节输入流,读取本机上的数据源图片
FileInputStream fis = new FileInputStream(filePath); //开始读写字节数组,从输入流中读取到输出流
int len = 0;
byte[] bytes = new byte[1024];
while ((len = fis.read(bytes)) != -1){
os.write(bytes,0,len);
} //文件读完时给服务器写终止序列
socket.shutdownOutput(); //获取字节输入流,读取服务器的上传成功
InputStream inputStream = socket.getInputStream();
len = inputStream.read(bytes);
System.out.println("服务器返回:"+new String(bytes,0,len)); socket.close();
}
}
TCP图片上传服务器端
1.ServerSocket套接字对象,监听8000
ServerSocket serverSocket = ServerSocket(int port);
2.方法accept()获取客户端的连接对象
Socket socket = serverSocket.accept();
3.客户端连接对象获取字节输入流,读取客户端发送图片
InputStream in = socket.getInputStream();
4.创建File对象,绑定上传文件夹。判断文件夹存在,不存在则创建文件夹
File upload = new File("d:\\upload");
if (!upload.exists()){
upload.mkdirs();
}
5.创建字节输出流,数据目的File对象所在文件夹
String fileName = "pic"+System.currentTimeMillis()+ new Random().nextInt(9999)+".jpg";
FileOutputStream fos = new FileOutputStream(upload+File.separator+fileName);
6.字节流读取图片,字节流将图片写入到目的文件中
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes))!=-1){ //读的是客户端发过来图片的字节数组,只有读文件能读到-1,所以这里永远读不到-1,read()会一直阻塞。(需要客户端发送结束标志)
fos.write(bytes,0,len);
}
7.将上传成功回写给客户端
socket.getOutputStream().write(("上传到服务器"+socket.getLocalAddress().toString()+"成功").getBytes());
8.关闭资源
fos.close();
socket.close();
/**
* 多线程接收图片
* Created by Autumn on 2018/2/5.
*/
public class TCPThreadServer {
public static void main(String[] args) throws IOException {
//服务端不用指定ip地址,只需指定端口号
ServerSocket serverSocket = new ServerSocket(8000);
while(true){
//获得一个客户端Socket对象,开启一个线程
Socket socket = serverSocket.accept(); //线程阻塞
new Thread(new Upload(socket)).start();
}
}
} /**
* TCP图片上传服务器
* 1.ServerSocket套接字对象,监听8000
* ServerSocket serverSocket = ServerSocket(int port);
* 2.方法accept()获取客户端的连接对象
* Socket socket = serverSocket.accept();
* 3.客户端连接对象获取字节输入流,读取客户端发送图片
* InputStream in = socket.getInputStream();
* 4.创建File对象,绑定上传文件夹。判断文件夹存在,不存在则创建文件夹
* File upload = new File("d:\\upload");
* if (!upload.exists()){
* upload.mkdirs();
* }
* 5.创建字节输出流,数据目的File对象所在文件夹
* String fileName = "pic"+System.currentTimeMillis()+ new Random().nextInt(9999)+".jpg";
* FileOutputStream fos = new FileOutputStream(upload+File.separator+fileName);
* 6.字节流读取图片,字节流将图片写入到目的文件中
* byte[] bytes = new byte[1024];
* int len = 0;
* while((len = in.read(bytes))!=-1){ //读的是客户端发过来图片的字节数组,只有读文件能读到1,所以永远读不到-1
* fos.write(bytes,0,len);
* }
* 7.将上传成功回写给客户端
* socket.getOutputStream().write(("上传到服务器"+socket.getLocalAddress().toString()+"成功").getBytes());
* 8.关闭资源
* fos.close();
* socket.close();
* Created by Autumn on 2018/2/5.
*/
public class Upload implements Runnable {
private Socket socket; public Upload(Socket socket){
this.socket = socket;
}
@Override
public void run() {
try {
//获取输入流
InputStream in = socket.getInputStream();
//创建文件夹
File upload = new File("d:\\upload");
if (!upload.exists()){
upload.mkdirs();
}
String fileName = "pic"+System.currentTimeMillis()+ new Random().nextInt(9999)+".jpg";
//创建字节输出流,将图片写入到目的文件夹 upload:d://upload
FileOutputStream fos = new FileOutputStream(upload+File.separator+fileName);
//读写字节数组
byte[] bytes = new byte[1024];
int len = 0;
while((len = in.read(bytes))!=-1){ //读的是客户端发过来图片的字节数组,只有读文件能读到1,所以永远读不到-1
fos.write(bytes,0,len);
}
System.out.println("成功接收来自"+socket.getInetAddress()+socket.getPort()+"的图片!");
//通过客户端连接对象获取字节输出流
//上传成功写会客户端
socket.getOutputStream().write(("上传到服务器"+socket.getLocalAddress().toString()+"成功").getBytes());
fos.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
java网络编程之图片上传的更多相关文章
- Java网络编程——TCP图片上传
1.编写一个服务器端程序,用来接收图片.创建一个监听指定端口号的ServerSocket服务端对象,在while(true)无限循环中持续调用ServerSocket的accept()方法来接收客户端 ...
- AFNetworking网络请求与图片上传工具(POST)
AFNetworking网络请求与图片上传工具(POST) .h文件 #import <Foundation/Foundation.h> /** 成功Block */ typedef vo ...
- Android利用网络编程HttpClient批量上传(一个)
请尊重他人的劳动成果.转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP訪问网络资源>一文中介绍过HttpCient ...
- Android利用网络编程HttpClient批量上传(两)AsyncTask+HttpClient监测进展情况,并上传
请尊重别人的劳动.转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 执行效果图: 我曾在<Andro ...
- Java+jquery实现裁剪图片上传到服务器
大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...
- iOS图片上传1
这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问题,在这里总结一下. [部分知识] iphone中图像通常存储在4个地方[相册.应用程序包.沙盒.Internet], ...
- ios中摄像头/相册获取图片压缩图片上传服务器方法总结
本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下. 这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- java实现图片上传功能,并返回图片保存路径
1.前端html <div class="form-group"> <label for="inputPassword3" class ...
随机推荐
- UVA10534:Wavio Sequence(最长递增和递减序列 n*logn)(LIS)好题
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68553#problem/B 题目要求: Wavio是一个整数序列,具有以下特性 ...
- MongoDB的分布式部署
一.分片的概念 分片(sharding)是指根据片键,将数据进行拆分,使其落在不同的机器上的过程.如此一来,不需要功能,配置等强大的机器,也能储存大数据量,处理更高的负载. 二.分片的原理和思想 Mo ...
- (转)CentOs7.3 搭建 RabbitMQ 3.6 Cluster 集群服务与使用
RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.Java.JMS.C.PHP.ActionScript.XMPP.STO ...
- java中使用MD5对密码进行加密
import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder; import org ...
- Selenium 方法封装 一
Selenium 封装 Selenium 封装 WebDriver对页面的操作,需要找到一个WebElement,然后再对其进行操作,比较繁琐: WebElement element =driver. ...
- 爬虫——请求库之selenium模块
阅读目录 一 介绍 二 安装 三 基本使用 四 选择器 五 等待元素被加载 六 元素交互操作 七 其他 八 项目练习 一 介绍 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解 ...
- 理解js的DOM操作
1.DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动.document.documentElement 返回文档的根节点<html> document.body ...
- 【c++ primer, 5e】定义类相关的非成员函数
练习 7.6 & 7.7 #include <iostream> #include <string> using namespace std; // Sales_dat ...
- 如何用纯 CSS 创作一个变色旋转动画
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/ejZWKL 可交互视频 ...
- linux启动过程⭐
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...