Java-多线程上传图片

 1、TCP客户端,用于调用图片进行上传服务器

package cn.bruce.TCPupload;

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、使用自己的流对象,读取图片fileinputstream
 * 4、使用字节数组进行缓冲,使用输出流,将图片输出到服务器
 * 5、通过Socket套接字获取字节输入流,打印服务器传回的上传成功、
 * 6、关闭资源
 */
public class TCPCLIENT {
    public static void main(String[] args) throws IOException, IOException {
        // 创建socket,连接服务器
        Socket s = new Socket("127.0.0.1", 8888);
        // 通过客户端的套接字对象Socket方法,获取字节输出流,将数据写向服务器
        OutputStream out = s.getOutputStream();
        // 读取图片
        FileInputStream fis = new FileInputStream("D:\r.jpg");
        // 服务服务器发回的数据
        InputStream in = s.getInputStream();
        int len = 0;
        byte[] data = new byte[1024];
        while ((len = fis.read(data)) != -1)
        {
            out.write(data, 0, len);
        }
        s.shutdownOutput();//给服务器写终止序列(很重要!)
        System.out.println(new String(data, 0, in.read(data)));
        s.close();
        fis.close();
    }
}

2、TCPsevers服务器端 用于接收客户端传来的数据(实际是接收客户端套接字对象)

package cn.bruce.TCPupload;

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

public class TCPSEVERS {
    public static void main(String[] args) throws IOException {
        // 创建服务器对象
        ServerSocket ss = new ServerSocket(8888);
        while (true)
        {
            // 调用accept()方法,获取客户端套接字对象
            Socket s = ss.accept();
            //获取到一个客户端,必须开启新线程
            new Thread(new Threadrun(s)).start();
        }
    }
}

3、线程代码实现  传入socket对象  对进行收到的数据进行接收处理

package cn.bruce.TCPupload;

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

public class Threadrun implements Runnable {
    private Socket s;

    public Threadrun(Socket socket)
    {
        s = socket;
    }

    @Override
    public void run() {
        try
        {
            // 通过套接字对象,socket获取字节
            InputStream in = s.getInputStream();
            // 服务器向客户端回数据,字节输出流,通过客户端套接字对象获取字节输出流
            OutputStream out = s.getOutputStream();
            byte[] data = new byte[1024];
            File file = new File("D:\test");
            if (!file.exists())
            {
                file.mkdirs();
            }
            //命名规则
            String s1 = System.currentTimeMillis() + new Random().nextInt(999)+".jpg";
            // 创建字节输出流,将图片写到文件夹里
            FileOutputStream fos = new FileOutputStream(file + "\" + s1);
            int len = 0;
            if ((len = in.read(data)) != -1)
            {
                fos.write(data, 0, len);
            }
            s.getOutputStream().write("上传成功!".getBytes());//给客户端反馈信息
            fos.close();
            s.close();
        } catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

原文地址:https://www.cnblogs.com/BruceKing/p/13790405.html