Java 上传文件 Socket类应用 多线程上传 有注释哈,上传完请看看文件大小是否正常

来源:互联网 发布:mac的路径怎么写 编辑:程序博客网 时间:2024/06/07 07:33

由于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;}@Overridepublic 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();}}}}}


0 0
原创粉丝点击