java上传网络图片_java网络编程之图片上传

本文围绕Java实现图片上传展开,先介绍输入输出流核心代码,用于文件传输。接着详细给出TCP图片上传客户端和服务器端的实现步骤及代码,客户端通过Socket连接服务器并上传图片,服务器端监听端口接收图片,还实现了多线程接收图片功能。

输入输出流核心代码

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

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 classTCPClient {public static void main(String[] args) throwsIOException {

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");

}/*** 上传图片

*@paramip 服务器ip地址

*@paramport 服务器端口号

*@paramfilePath 文件路径

*@throwsIOException*/

public static void uploadPic(String ip,int port,String filePath) throwsIOException{//创建客户端Socket

Socket socket = newSocket(ip,port);//根据Socket获取字节输出流,用此流将图片写到服务器

OutputStream os =socket.getOutputStream();//创建字节输入流,读取本机上的数据源图片

FileInputStream fis = newFileInputStream(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 classTCPThreadServer {public static void main(String[] args) throwsIOException {//服务端不用指定ip地址,只需指定端口号

ServerSocket serverSocket = new ServerSocket(8000);while(true){//获得一个客户端Socket对象,开启一个线程

Socket socket = serverSocket.accept(); //线程阻塞

new Thread(newUpload(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 implementsRunnable {privateSocket socket;publicUpload(Socket socket){this.socket =socket;

}

@Overridepublic voidrun() {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();

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值