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