输入输出流核心代码

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

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. 记CM+kerberos环境停电后无法启动报错An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism leve

    公司突然停电,然后cm环境无法重启,报错 An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslExc ...

  2. java中使用MD5对密码进行加密

    import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder; import org ...

  3. Linux服务器access_log日志分析及配置详解(二)

    默认nginx / Linux日志在哪个文件夹? 一般在 xxx.xxx.xxxx.com/home/admin 路径下面的error.log文件和access.log文件error_log logs ...

  4. Selenium之使用PageFactory初始化pageobject

    使用PageFactory初始化pageobject有什么作用呢,下面举个例子来说明 public BaiduPage baiduPage = PageFactory.initElements(dri ...

  5. 微信小程序组件action-sheet

    操作反馈action-sheet:官方文档 Demo Code: Page({ data: { actionSheetHidden: true, actionSheetItems: ['item1', ...

  6. Redis持久化及复制

    一.持久化的两种方式 1.RDB: RDB是在指定时间间隔内生成数据集的时间点快照(point-in-time snapshot)持久化,它是记录一段时间内的操作,一段时间内操作超过多少次就持久化.默 ...

  7. 【转】网页窗口DIV自定义拖动

    一个来自网上的东西- -被我捡到了 然后我访问到了 发出来就可以粘贴复制自己做成js文件了吧 // by zhangxinxu welcome to visit my personal website ...

  8. C++与C混编

    C++与C混编 本案例通过实现一个简单的UDP服务器来说明C++与C的混合编程问题 C代码 通过C代码来对UDP服务器的创建,监听进行封装 udp.c文件 #include <sys/types ...

  9. PHP递归算法

    /** * 获取菜单 * @param number $id * @return multitype: */ public function menu($id = 0) { $menu = M ( ' ...

  10. Python3.x:常用基础语法

    Python3.x:常用基础语法 1,if else语句: 不执行if内的语句,需要用:pass if i>2: #跳过不执行 pass else: print("i= %s" ...