输入输出流核心代码

所有的文件传输都是靠流,其中文件复制最具代表性.输入流和输出流,从输入流中读取数据写入到输出流中。

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();
}
}
}

  code

java网络编程之图片上传的更多相关文章

  1. Java网络编程——TCP图片上传

    1.编写一个服务器端程序,用来接收图片.创建一个监听指定端口号的ServerSocket服务端对象,在while(true)无限循环中持续调用ServerSocket的accept()方法来接收客户端 ...

  2. AFNetworking网络请求与图片上传工具(POST)

    AFNetworking网络请求与图片上传工具(POST) .h文件 #import <Foundation/Foundation.h> /** 成功Block */ typedef vo ...

  3. Android利用网络编程HttpClient批量上传(一个)

    请尊重他人的劳动成果.转载请注明出处:Android网络编程之使用HttpClient批量上传文件 我曾在<Android网络编程之使用HTTP訪问网络资源>一文中介绍过HttpCient ...

  4. Android利用网络编程HttpClient批量上传(两)AsyncTask+HttpClient监测进展情况,并上传

    请尊重别人的劳动.转载请注明出处: Android网络编程之使用HttpClient批量上传文件(二)AsyncTask+HttpClient并实现上传进度监听 执行效果图: 我曾在<Andro ...

  5. Java+jquery实现裁剪图片上传到服务器

    大体分两步: 1.利用jquery裁剪图片,把裁剪到的几个点传入后端 2.利用前端传入的几个点,来裁剪图片 首先,用到一个jquery的插件 imgAreaSelect 实例及插件下载地址:http: ...

  6. iOS图片上传1

    这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问题,在这里总结一下. [部分知识] iphone中图像通常存储在4个地方[相册.应用程序包.沙盒.Internet], ...

  7. ios中摄像头/相册获取图片压缩图片上传服务器方法总结

    本文章介绍了关于ios中摄像头/相册获取图片,压缩图片,上传服务器方法总结,有需要了解的同学可以参考一下下.     这几天在搞iphone上面一个应用的开发,里面有需要摄像头/相册编程和图片上传的问 ...

  8. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  9. java实现图片上传功能,并返回图片保存路径

    1.前端html <div class="form-group">     <label for="inputPassword3" class ...

随机推荐

  1. JMS术语

    Provider(MessageProvider):生产者Consumer(MessageConsumer):消费者PTP:Point to Point,即点对点的消息模型Pub/Sub:Publis ...

  2. 关于手机适配中的rem的学习随笔

    githup 下载地址 :https://github.com/comjustforfun/remformobile adaptivejs利用rem解决移动端页面开发的自适应问题 页面模板初始化的时候 ...

  3. JUnit之参数化测试、套件/成组测试的使用

    原文地址http://blog.csdn.net/yqj2065/article/details/39967065 参数化测试 正如数组替代int a0,a1,a2一样,测试加法时assertEqua ...

  4. 腾讯 微信春招nlp实习生一面二面(猝)

    一面: 1.算法题: 1 28数组中出现次数超过一半的数字 2 手写快排:八大排序算法总结(2) 2.项目介绍: 大多都是项目中涉及到的技术. TFIDF 的原理 word2vec的原理 3.算法原理 ...

  5. HDU - 4609 3-idiots (FFT+母函数)

    题意:给N个数,求任意选三个数能构成三角形的概率 分析:枚举两条边之和的复杂度\(O(N^2)\),显然不行,所以要更高效地做到枚举出两边之和. 所以用生成函数搭配FFT在\(O(NlogN)\)的时 ...

  6. TOSCA自动化测试工具--How to modify windows

    1.页面窗口(高亮的部分是我们需要的所有窗口) 2.窗口可以任意拖拽到任何地方 3.窗口可以并列显示 任务栏点击按钮可以继续拖动 放到自己想放的地方 4.收起preview,调整宽窄 5.保存当前wi ...

  7. Spring MVC 复习笔记02

    1. 非注解的处理器映射器和适配器 1.1 非注解的处理器映射器 处理器映射器:org.springframework.web.servlet.handler.BeanNameUrlHandlerMa ...

  8. MyEclipse 2014优化设置(禁用myeclipse updating indexes)

    1.指定本机java环境 Windows-->preferences-->java-->Insetallel JREs 右侧 单击ADD standard VM-->Next ...

  9. Oracle中验证非空的函数NVL(),NVL2()总结

    1.NVL()函数 NVL函数的格式如下: NVL(expr1,expr2) 含义是:如果oracle第一个参数为空那么显示第二个参数的值,如果第一个参数的值不为空,则显示第一个参数本来的值. 2 N ...

  10. ThreadLocal的设计理念与作用

    转自:http://www.iteye.com/topic/103804 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线 ...