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
- Java 上传文件 Socket类应用 多线程上传 有注释哈,上传完请看看文件大小是否正常
- java socket 文件上传 有文件名
- WEB多线程Socket文件上传
- WEB多线程Socket文件上传
- Java计算上传文件大小
- JS判断文件大小是否上传
- Java-Socket TCP-文件上传
- java-Socket文件上传/进度条
- java 多线程上传解压文件
- IIS文件上传文件大小配置
- php上传文件大小限制文件
- struts文件上传 文件大小控制
- struts文件上传(上传文件大小设置、验证文件大小)
- struts文件上传(上传文件大小设置、验证文件大小)
- Java文件上传类FileUploadUtil.java代码+注释
- Java文件上传类FileUploadUtil.java代码+注释
- svn文件下有.git文件 不能正常上传
- JAVA 上传文件类
- Jlink + Vmware虚拟机调试uboot
- 字符串倒序(the c programming)
- cocos2d-x 播放视频 on Android
- 2014哈工程校赛
- hdu 1045 贪心回溯
- Java 上传文件 Socket类应用 多线程上传 有注释哈,上传完请看看文件大小是否正常
- 亚伦•斯沃茨:提升时间的品质
- jsoup+jxl java代码post请求,并解析返回的html
- cocos2dx2.2 自适应屏幕
- 指针交换三个数 排序输出
- hdu1108 GCD LCM 模板
- LeetCode-TwoSum
- 这些代码,我怎么看都不觉得厌烦!
- 配置Tomcat成为系统服务