【JAVA】Socket文件上传遇到的问题!~
2013-09-02 16:24
489 查看
同事做的socket通信上传文件有问题。让我改。发现每次得到文件名称。但是流已经写入了。文件名是第一次上传的文件名字。网上看了下就这样写的。也不知道原因,这里把错误代码贴下。大家帮我看下什么原因。。。新代码是网上找到的创建了个线程就好了。
服务器端:
错误代码:
正确代码:
客户端代码:
转帖请注明原帖地址:/article/11106994.html
服务器端:
错误代码:
package com.zssoft.mis.struts2.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.net.ServerSocket; import java.net.Socket; public class FileServer { private ServerSocket server = null; Socket socket = null; public void getData(String savePath,int port) { int progress = 0; try { // 建立socket监听。 server = new ServerSocket(port); while ( (socket = server.accept()) != null) { // 建立socket输入流 DataInputStream inputStream = new DataInputStream(new BufferedInputStream(socket .getInputStream())); // 缓冲区大小 int bufferSize = 8192; // 缓冲区 byte[] buf = new byte[bufferSize]; int passedlen = 0; long len = 0; // 获取文件名称 if( !savePath.contains(".")) savePath += inputStream.readUTF(); DataOutputStream fileOut = new DataOutputStream( new BufferedOutputStream(new BufferedOutputStream( new FileOutputStream(savePath)))); // 获取文件长度 len = inputStream.readLong(); System.out.println("文件的长度为:" + len + " KB"); System.out.println("开始接收文件!"); // 获取文件,下边是进度条。 System.out.print("#>>>>>>>>#>>>>>>>>>#>>>>>>>>>#>>>>>>>>>#>>>>>>>>>#"); System.out.println(">>>>>>>>>#>>>>>>>>>#>>>>>>>>>#>>>>>>>>>#>>>>>>>>>#"); while (true) { int read = 0; if (inputStream != null) { read = inputStream.read(buf); } passedlen += read; if (read == -1) { break; } if((int)(passedlen * 100.0 / len)-progress > 0){ progress = (int)(passedlen * 100.0 / len); // System.out.println("文件接收了" + progress + "%"); System.out.print(">"); } fileOut.write(buf, 0, read); } System.out.println(); System.out.println("接收完成,文件存为: " + savePath); fileOut.close(); } }catch (Exception e){ System.err.println("File Server Excetption: " + e); e.printStackTrace(); } } public static void main(String[] args) { //函数运行之前要指定待传送文件地址。 /*if(args.length != 2){ System.err.println("Usage: FileServer <save path> <port>"); System.exit(-1); }*/ new FileServer().getData("F:\\", 9600); // new FileServer().getData(args[0], Integer.parseInt(args[1])); } }
正确代码:
package com.zssoft.mis.struts2.util; import java.net.ServerSocket; import java.net.Socket; public class FileServer { protected int listenPort = 9600; public static void main(String[] args) { FileServer server = new FileServer(); server.acceptConnections(); } /** * 建立链接 * */ public void acceptConnections() { try { ServerSocket server = new ServerSocket(listenPort); Socket socket = null; while (true) { socket = server.accept(); // handleConnection(socket); new ServerThread(socket).start(); } } catch (Exception e) { System.out.println("Unable to bind to port " + listenPort); } } }
package com.zssoft.mis.struts2.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.net.Socket; public class ServerThread extends Thread { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } public void run() { try { DataInputStream inputStream = null; try { inputStream = new DataInputStream(new BufferedInputStream( socket.getInputStream())); } catch (Exception e) { System.out.print("接收消息缓存错误\n"); return; } try { // 本地保存路径,文件名会自动从服务器端继承而来最好是web工程里的一个路径。 String savePath = "F:\\"; int bufferSize = 8192; byte[] buf = new byte[bufferSize]; long len = 0; savePath += inputStream.readUTF(); DataOutputStream fileOut = new DataOutputStream( new BufferedOutputStream(new BufferedOutputStream( new FileOutputStream(savePath)))); len = inputStream.readLong(); System.out.println("文件的长度为:" + len + "\n"); System.out.println("开始接收文件!" + "\n"); while (true) { int read = 0; if (inputStream != null) { read = inputStream.read(buf); } if (read == -1) { break; } // System.out.println(buf.toString()); fileOut.write(buf, 0, read); } System.out.println("接收完成,文件存为" + savePath + "\n"); fileOut.flush(); fileOut.close(); inputStream.close(); } catch (Exception e) { System.out.println("接收消息错误" + "\n"); return; } } catch (Exception e) { System.out.println("Error handling a client: " + e); } } }
客户端代码:
package com.zssoft.mis.struts2.util; import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.Socket; public class FileClient { public void sendData(String filepath, String IP, int port) { int progress = 0; // socket输出流 DataOutputStream os = null; // 文件输入流 DataInputStream is = null; // 建立socket连接 Socket socket = null; try { // 选择进行传输的文件 File file = new File(filepath); // 建立socket连接 socket = new Socket(IP, port); os = new DataOutputStream(socket.getOutputStream()); // 将文件名及长度传给服务器端。 os.writeUTF(file.getName()); os.flush(); os.writeLong((long) file.length()); os.flush(); is = new DataInputStream(new BufferedInputStream( new FileInputStream(filepath))); // 缓冲区大小 int bufferSize = 8192; // 缓冲区 byte[] buf = new byte[bufferSize]; // 传输文件 while (true) { int read = 0; if (is != null) { read = is.read(buf); } progress += Math.abs(read); if (read == -1) { break; } os.write(buf, 0, read); //发送进度。 System.out.println("文件已发送:" + (int)(100.0*progress/file.length()) + "%"); } os.flush(); System.out.println("\n文件已上传完毕!"); }catch (IOException e) { e.printStackTrace(); } finally { // 关闭所有连接 try { if (os != null) os.close(); } catch (IOException e) { } try { if (is != null) is.close(); } catch (IOException e) { } try { if (socket != null) socket.close(); } catch (IOException e) { } } } public static void main(String[] args) { new FileClient().sendData("D:\\aa.swf", "10.78.151.188", 9600); } }源代码下载:http://download.csdn.net/detail/hateson/6198049
转帖请注明原帖地址:/article/11106994.html
相关文章推荐
- Java使用Socket传输文件遇到的问题
- Java使用Socket传输文件遇到的问题(转)
- 解决:使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题.
- 使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题
- 关于java socket 传输文件时遇到的问题
- Java使用Socket传输文件遇到的问题
- java中springMVC文件上传遇到的问题
- 使用java连接Fastdfs,上传文件时报:SocketTimeOutException的问题.
- 小存储嵌入式设备上使用thttpd进行文件上传遇到的问题
- javaWeb开发中关于eclipse等ide重新部署或重启项目等原因造成上传文件丢失问题解决方案
- SpringMVC上传文件遇到的问题
- FTP上传文件,报错java.net.SocketException: Software caused connection abort: recv failed
- java服务器下载文件中遇到的编码问题
- Apache+PHP,swfupload做批量上传时遇到的文件类型支持问题和文件上传大小限制问题的相应解决方案
- socket iOS 与java 后台进行socket通讯遇到的问题以及解决方法
- 原生java http方式上传大文件(含 文件流分段上传问题、base64分段转码问题解决思路)
- java代码实现文件上传到linux服务器及问题汇总及解决(亲测可行)
- Java操作Zip压缩文件遇到的编码问题
- java web上传文件,普通表单和文件名乱码问题