如何再BIO下实现任意类型的文件传输呢?
1.服务端代码: public class Server { public static void main(String[] args) { try { ServerSocket ss = new ServerSocket(8888); System.out.println("服务端启动,等待客户端连接...."); while (true) { Socket socket = ss.accept(); //重点1:一个上传任务启动一个线程处理 new ServerReaderThread(socket).start(); } } catch (IOException e) { e.printStackTrace(); } } } 2.服务端上传线程处理类: public class ServerReaderThread extends Thread { private Socket socket; public ServerReaderThread(Socket socket) { this.socket = socket; } @Override public void run() { try { System.out.println("服务端读取线程启动....."); //1.获取一个数据输入流读取客户端发送来的数据 DataInputStream dis=new DataInputStream(socket.getInputStream()); //2.读取客户端发来的文件类型 String suffix=dis.readUTF(); System.out.println("服务端读取到客户端发送来的文件类型:"+suffix); //3.定义一个字节输出管道负责将客户端发送来的数据写出去 OutputStream os=new FileOutputStream("C:\\Users\\24459\\Desktop\\server\\"+ UUID.randomUUID().toString()+suffix); byte[] buffer=new byte[1024]; int len; //读取次数 int i = 0; while ((len=dis.read(buffer))>0){ System.out.println("第"+(i++)+"次读取,读取长度:"+len); os.write(buffer,0,len); } os.close(); System.out.println("服务端读取结束!"); }catch (Exception e){ e.printStackTrace(); } } } 3.客户端 /** * 目标:实现客户端上传任意类型的文件数据到服务端保存起来 */ public class Client { public static void main(String[] args) { try ( InputStream is = new FileInputStream("C:\\Users\\24459\\Desktop\\client\\20200724194309755.png"); ) { System.out.println("客户端启动!"); Socket socket = new Socket("127.0.0.1", 8888); //2.将字节输出流包装称一个数据输出流 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //3.先发送一个字符串给服务端:这里可以先发送文件的后缀 dos.writeUTF(".png"); //4.用一个字节一个字节进行发送 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { Thread.sleep(2); dos.write(buffer, 0, len); } dos.flush(); System.out.println("客户端发送完毕!"); } catch (Exception e) { e.printStackTrace(); } } }
问题:
当客户端上传执行结束时,服务端抛出异常,并且上传的图片并不能打开!
这是什么原因呢??
如何改进呢?
/** * 目标:实现客户端上传任意类型的文件数据到服务端保存起来 */ public class Client { public static void main(String[] args) { try ( InputStream is = new FileInputStream("C:\\Users\\24459\\Desktop\\client\\20200724194309755.png"); ) { System.out.println("客户端启动!"); Socket socket = new Socket("127.0.0.1", 8888); //2.将字节输出流包装称一个数据输出流 DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //3.先发送一个字符串给服务端:这里可以先发送文件的后缀 dos.writeUTF(".png"); //4.用一个字节一个字节进行发送 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { Thread.sleep(2); dos.write(buffer, 0, len); } dos.flush(); //重点:只需要在客户端发送完毕后,停止输出流! socket.shutdownOutput(); System.out.println("客户端发送完毕!"); } catch (Exception e) { e.printStackTrace(); } } } 这样服务端的判断: public void run() { try { .... 读取到的会是-1,从而读取完数据后,退出循环 while ((len=dis.read(buffer))>0){ System.out.println("第"+(i++)+"次读取,读取长度:"+len); os.write(buffer,0,len); } .... }catch (Exception e){ e.printStackTrace(); } }