日期:2014-05-20  浏览次数:20790 次

大公司的一道上机题,请高手帮忙看看
两个服务器提供文件共享服务。 

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();
                }
            }
        }
    }
}