两个服务器提供文件共享服务。
1. 服务器A和服务器B提供文件上传下载服务。服务器A是主服务器,服务器B是备用服务器。
2. 有5个客户端同时上传不同的大文件(200M~500M),当上传开始1分钟后随意启动N个客户端(命令行输入),每个客户端在这5个上传中的文件中随机选择一个文件下载
3. 中间突然停掉服务器A并保持服务器B继续服务
整个过程能顺利进行,所有下载的文件是完整并且正确的。请用Java编写,不用写界面。
请高手给点思路,thankyou。
------解决方案--------------------------------------------------------
1. 服务器A和服务器B提供文件上传下载服务。服务器A是主服务器,服务器B是
备用服务器
客户端如果是网络分布,那么你需要采用分布式来做,说白了就是一个服务器核心服务器提供任务部署,第二个服务器是为了防止意外情况的备用服务器。
2. 有5个客户端同时上传不同的大文件(200M~500M),当上传开始1分钟后随意启动N个客户端(命令行输入),每个客户端在这5个上传中的文件中随机选择一个文件下载
这里你用线程异步来做,主要是处理I/O的并发任务,也没什么。
3. 中间突然停掉服务器A并保持服务器B继续服务
主服务器出现异常,那么需要将主服务器的数据拷贝到备用服务器上,当然主服务器处理任务的时候需要备份副本,出现异常也就自动移动到备用服务器继续服务。
------解决方案--------------------------------------------------------
要写一个发送端和一个接收端
同时监听线程
这样就可以实现
------解决方案--------------------------------------------------------
写了个简单的,也没写完,用socket和IO写的
- Java code
import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server { private ServerSocket serverSocket = null; private Socket socket = null; public void getFile(int port) { try { serverSocket = new ServerSocket(port); System.out.println("server start...."); while (true) { socket = serverSocket.accept(); System.out.println(socket.getInetAddress() + " is connected the server..."); Thread serverThread = new ServerThread(socket); serverThread.start(); } } catch (IOException e) { e.printStackTrace(); } } class ServerThread extends Thread { private Socket socket; public ServerThread(Socket socket) { this.socket = socket; } public void run() { File file = null; DataInputStream in = null; DataOutputStream out = null; try { in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); if (in.readChar() == '?') { downloadFile(in, out, file); } else { uploadFile(in, out, file); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); if (out != null) out.close(); if(socket!=null){ socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } public void uploadFile(DataInputStream in, DataOutputStream out, File file) { try { String fileName = null; StringBuffer stringBuffer = new StringBuffer(); char c = '\\'; while ((c = in.readChar()) != '\\') { stringBuffer.append(c); } fileName=stringBuffer.toString().substring(0, stringBuffer.length()); file = new File("e:\\back\\" + fileName); long pointer=in.readLong(); out.writeLong(file.length()); if(file.length()==0){ out.write(-1); }else if(file.length()-pointer > -1){ in = new DataInputStream(new FileInputStream(file)); int i = -1; byte[] buffer = new byte[1024*512]; while ((i = in.read(buffer)) != -1) { out.write(buffer, 0, i); pointer+=i; } out.write(-1); }else{ out.write(-1); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); if (out != null) out.close(); if(socket!=null){ socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } public void downloadFile(DataInputStream in, DataOutputStream out, File file) { try { String fileName = null; StringBuffer stringBuffer = new StringBuffer(); char c = '\\'; while ((c = in.readChar()) != '\\') { stringBuffer.append(c); } fileName = socket.getInetAddress() + "-" + stringBuffer.toString(); file = new File("e:\\back\\" + fileName); out.writeLong(file.length()); out = new DataOutputStream(new FileOutputStream(file, true)); int i = -1; byte[] buffer = new byte[1024]; while ((i = in.read(buffer)) != -1) { out.write(buffer, 0, i); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (in != null) in.close(); if (out != null) out.close(); if(socket!=null){ socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } }}