java实现服务端开启多线程处理客户端的上传图片请求

将客户端c:\\a.jpg 上传到e:\\公司名称+6位随机数.jpg  这样为了不断开连接客户端每次上传的图片名字不重名覆盖,验证之用

 这里需要注意的是Socket的终止客户端的输入方法  shutdownOutput,如果不关闭发送服务器的输出流,线程就会阻塞,就没法接下去

接受服务发来的输入入流。

package demo04;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
 *  实现TCP图片上传客户端
 *  实现步骤:
 *      1.Socket套接字连接服务器
 *      2.通过Socket获取字节输出流,写图片
 *      3.使用自己的流对象,读取图片数据源
 *          FileInputSteam
 *      4.读取图片,使用字节输出流,将图片写到服务器
 *        采用字节数组进行缓冲
 *      5.通过Socket套接字获取字节输入流
 *        读取服务器发回来的上传成功
 *      6.关闭资源
 */
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("c:\\a.jpg");
        //开始读写字节数组
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=fis.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        //给服务器写终止序列,
        socket.shutdownOutput();
        //获取字节输入流,读取服务器的上传成功
        InputStream in=socket.getInputStream();
        len=in.read(bytes);//如果读完会处于一直等待,进入阻塞状态
        System.out.println(new String(bytes,0,len));
        
        fis.close();
        socket.close();
        
    
    }
}

 

服务端的代码  实现runnale接口方式

package demo04;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
import java.util.Random;

public class Upload implements Runnable{
    
    private Socket socket;
    
    public Upload(Socket socket){this.socket=socket;}
    
    public void run() {
        try{
        //通过客户端连接对象,获取字节输入流,读取客户端图片
        InputStream in=socket.getInputStream();
        //将母的文件夹封装发哦File对象
        File upload=new File("e:\\upload");
        if(!upload.exists())
            upload.mkdirs();
        //创建字节输出流,将图片写入到母的文件中
        //规则:域名+毫秒值+6位随机数
        String filename="albb"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg";
        //创建字节输出流,将图片写入到目的文件夹中
        FileOutputStream fos=new FileOutputStream(upload+File.separator+filename);//separator跨平台的文件分隔符方法
        byte[] bytes=new byte[1024];
        int len=0;
        while((len=in.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        
        //通过客户端对象获取字节输出流
        //上传成功写回客户端
        socket.getOutputStream().write("上传成功".getBytes());
        
        fos.close();
        socket.close();
        
        
        }catch(Exception e){
            
        }
        
    }
    

}

开启多线程的代码

package demo04;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPThreadServer {
    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();
        }
    }
}

 

转载于:https://www.cnblogs.com/benjamin77/p/9147512.html

你可能感兴趣的:(java实现服务端开启多线程处理客户端的上传图片请求)