由于Java上传文件到服务器是流之间的相互流淌,所以文件名是个问题,我采用的首先把文件名传到服务器,使用用户上传的文件名进行保存,
同时进行了文件覆盖问题的操作,若是服务器存在同名文件,则重新命名后保存,这时有个问题!
就是在查找是否有重名文件时客户端已经再上传文件了,所以导致报错不能到达想要的效果,
我采用的是在服务器查找重名文件时,使客户端处于挂起状态,
即服务器重命名完成后才会给客户顿返回一个标志,收到标志客户端才会进行上传文件操作。
具体请看代码哈,欢迎交流!
文件上传使用的是:打印流,比较高效且自动刷新
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.net.Socket; import java.net.SocketException; /** * 服务器线程类 * * @author kaifang * */ public class ServerUp implements Runnable { private Socket socket = null; public ServerUp(Socket socket) { this.socket = socket; } @Override public void run() { BufferedOutputStream outputStream = null; try { System.out .println(socket.getInetAddress().getHostAddress() + " 连接"); // 读取传过来的文件字节流对象,避免文件名重复覆盖 BufferedInputStream inputStream = new BufferedInputStream( socket.getInputStream()); // 存储上传文件的文件夹 File dir = new File("F:\\temp"); if (!dir.exists()) { dir.mkdir(); } // 读取客户端发过来的文件名 int len = 0; byte[] bys = new byte[1024 * 10]; len = inputStream.read(bys); String name = new String(bys, 0, len); File file = new File(dir, name); int count = 0; // 如果服务器存在此文件则重名命名 while (file.exists()) { count++; file = new File(dir, name.replaceAll("(.+)\\.(.+)", "$1(" + count + "\\).$2")); } // 告知客户端 PrintStream writer = new PrintStream(socket.getOutputStream(), true); writer.write("ok".getBytes()); System.out.println(file.getAbsolutePath()); // 写入文件到服务器字节流 outputStream = new BufferedOutputStream(new FileOutputStream(file)); // 循环读写文件到服务器 while ((len = inputStream.read(bys)) != -1) { outputStream.write(bys, 0, len); outputStream.flush(); } // 告知客户端接收完毕 writer.write("上传成功!".getBytes()); socket.shutdownOutput(); } catch (SocketException se) { System.out.println("客户端连接丢失!\n\t" + se.getMessage()); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭资源 if (outputStream != null) { try { outputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; /** * 服务器类 * * @author kaifang * */ public class ServerSocketUp { public ServerSocketUp() { super(); // TODO Auto-generated constructor stub } public static void main(String[] args) { System.out.println("服务器启动。。。"); getFiles(); System.out.println("服务器关闭。。。"); } public static void getFiles() { // 创建ServerSocket对象 ServerSocket server = null; try { server = new ServerSocket(10001); } catch (IOException e1) { e1.printStackTrace(); } Socket socket = null; while (true) { try { // 获取服务器Socket对象 socket = server.accept(); new Thread(new ServerUp(socket)).start(); } catch (IOException e) { e.printStackTrace(); } finally { // try { // // 关闭服务器,一般不会关闭的 // server.close(); // } catch (IOException e) { // e.printStackTrace(); // } } } } }
import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; /** * 客户端类 * * @author kaifang * */ public class SocketUp { public static void main(String[] args) { System.out.println("客户端启动。。。"); upFiles(); System.out.println("客户端关闭。。。"); } public static void upFiles() { Socket socket = null; BufferedInputStream inputStream = null; try { // 连接远程主机 socket = new Socket(InetAddress.getLocalHost(), 10001); // 读取本地文件的字节流 // File file = new File("F:\\Nano\\岁月的童话1.rmvb"); // File file = new File("aa.jpg"); File file = new File("cpy.mp3"); if (file.exists()) { inputStream = new BufferedInputStream(new FileInputStream(file)); // 通过Socket获取输出字节流 PrintStream writer = new PrintStream(socket.getOutputStream(), true); // 首先发送文件名到服务器 writer.write(file.getName().getBytes()); // 接收服务器回馈 BufferedInputStream reader = new BufferedInputStream( socket.getInputStream()); byte[] bys = new byte[1024 * 10]; int len = 0; len = reader.read(bys); String flag = new String(bys, 0, len); if ("ok".equals(flag)) { // 循环读取文件并发送 while ((len = inputStream.read(bys)) != -1) { writer.write(bys, 0, len); } // 告知服务器上传完毕 socket.shutdownOutput(); // 接收服务器回馈 len = reader.read(bys); System.out.println(new String(bys, 0, len)); } } else { System.out.println("文件不存在!"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { // 关闭资源 if (inputStream != null) { try { inputStream.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
Java 上传文件 Socket类应用 多线程上传 有注释哈,上传完请看看文件大小是否正常,布布扣,bubuko.com