Передача файлов клиент клиенту в JAVA - PullRequest
0 голосов
/ 12 ноября 2018

Мне нужно реализовать программу для передачи файлов.Я решил сделать это с помощью шаблона чата, который я создал около 1 месяца назад, чтобы у меня был чат с возможностью передачи файлов.Передача должна выполняться в следующих пунктах:

1- Сервер хранит только список всех файлов, предоставленных подключенными клиентами (на самом деле на сервере нет файлов, только их имена)

2-Клиент «1» запрашивает файл «А», затем:

, если файл «А» находится ТОЛЬКО в клиенте «2», то клиент «2» должен отправить 100% файла клиенту «1»

если файл «A» находится на клиенте «2» и клиент «3» также имеет файл «A», то клиент «2» должен отправить 50% файла клиенту «1» и клиенту «3»следует отправить остальные 50%.

(если файл находится в 4 клиентах, я должен быть 25% каждый .... и так далее ...)

Я ужеудалось заставить сервер выяснить, какой клиент запрашивает файл, и у кого он есть.Но сейчас я застрял, я не знаю, как сделать перевод.

Может ли кто-нибудь дать мне пример того, как это сделать?или укажи мне правильное направление?

[Я знаю, что в моем коде есть некоторые недостатки, и я исправлю это позже, сейчас мне нужно выполнить передачу, прежде чем работать над исправлениями, поэтому, пожалуйста, если это не связано, попробуйте сосредоточиться на этом]

Сервер:

package tor;

import java.util.*;
import java.io.*;
import java.net.*;

public class Server extends Thread {

private String cname;
private Socket client;
public static Vector<PrintStream> clients;
public static Vector<String> clientnames;
public static Vector<String> archives;
public Server(Socket client) {
    this.client = client;

}

public static void main(String[] args) {
    clients = new Vector<PrintStream>();
    clientnames = new Vector<String>();
    archives = new Vector<String>();

    try {

        ServerSocket server = new ServerSocket(2391);
        System.out.println("Server Started!!\n");
        while (true) {
            Socket client = server.accept();
            Server s = new Server(client);
            s.start();
        }

    } catch (IOException e) {
        System.out.println("Server could not start ");

    }

}


@Override
public void run() {

    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintStream out = new PrintStream(client.getOutputStream());
        cname = in.readLine();
        System.out.println(cname + " Connected --- SERVER!");

        if (cname == null) {
            System.out.println("Unknown Name");
            return;
        }
        clientnames.add(cname);
        clients.add(out);
        connected(" ********** [", cname, "] Connected! **********");

        String arq;
        int size = in.read();
        System.out.println(size);
        for (int i = 0; i < size; i++) {
            arq = in.readLine();
            archives.add(arq);
        }
        String msg = in.readLine();
        String selected;
        while (true) {
            while (!(msg).equals("/exit") && !(msg).equals("/Exit") && !(msg).equals("/EXIT")) {

                if ((msg).equals("/list") || (msg).equals("/List") || (msg).equals("/list")) {
                    out.println("-------- Archives List --------");
                    for (int i = 0; i < archives.size(); i++) {
                        out.println(i+"- "+archives.get(i));
                    }
                    out.println("-------- ******************* --------");
                    msg = in.readLine();
                } else if (msg.equals("/get") || (msg.equals("/GET")) || (msg.equals("/Get"))){
                    msg = in.readLine();
                    int gnum = Integer.parseInt(msg);
                    selected=archives.get(gnum);
                    returnAll("[", out, "]: ", "idreq");
                    out.println("1");
                    reqAll(selected);

                    // I BELIVE HERE IS THE RIGHT PLACE TO MAKE DE TRANSFER CODE


                    msg = in.readLine();
                } else {
                    returnAll("[", out, "]: ", msg);
                    msg = in.readLine();
                }
            }
            msg = in.readLine();
            size = Integer.parseInt(msg);
            for (int i = 0; i <= size; i++) {
                arq = in.readLine();
                for(int j=0;j<archives.size();j++) {
                if (archives.get(j).equals(arq)) {
                    archives.remove(j);
                }
                }
            }
            returnAll(" ********** [", out, "] disconnected ", " ********** ");
            clients.remove(out);
            clientnames.remove(cname);
            client.close();
            break;
        }
    } catch (IOException e) {
        System.out.println("A Client disconnected ");
    }

}

// METHOD TO SEND CONNECTION MESSAGE
public void connected(String msg1, String cname, String msg2) throws IOException {
    Enumeration<PrintStream> e = clients.elements();
    while (e.hasMoreElements()) {
        PrintStream message = (PrintStream) e.nextElement();
        message.println(msg1 + cname + msg2);
    }
}

// METHOD TO RETURN MESSAGE TO ALL CLIENTS
public void returnAll(String msg1, PrintStream saida, String ac, String msg2) throws IOException {
    Enumeration<PrintStream> e = clients.elements();
    while (e.hasMoreElements()) {
        PrintStream message = (PrintStream) e.nextElement();
        message.println(msg1 + cname + ac + msg2);
    }
}

public void reqAll(String req) throws IOException {
    Enumeration<PrintStream> e = clients.elements();
    while (e.hasMoreElements()) {
        PrintStream message = (PrintStream) e.nextElement();
        message.println(req);
    }
}


}

Клиент:

package tor;

import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Scanner;


public class Client extends Thread {
    private Socket con;
    private static boolean done = false;
    static ArrayList<String> localArq = new ArrayList<String>();
    static int c=0;

public Client(Socket s) {
    con = s;
}

public static void main(String[] args) {


    try {
        String ip;
        Scanner s = new Scanner(System.in);
        System.out.print("Enter Server's IP: ");
        ip =s.next();
        Socket con = new Socket(ip, 2391);
        PrintStream out = new PrintStream(con.getOutputStream());
        System.out.println("Connected to Server!");
        System.out.print("Enter your Nickname: ");
        BufferedReader scan = new BufferedReader(new InputStreamReader(System.in));
        String cname = scan.readLine();
        out.println(cname);
        String dir="C:\\javator\\"+cname;
        Thread t = new Client(con);
        t.start();

        File folder = new File(dir);
        folder.mkdir();
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
          if (listOfFiles[i].isFile()) {
            localArq.add(listOfFiles[i].getName());
          }
        }
        int size=localArq.size();
        out.write(size);
        for(int i=0;i<size;i++) {
            out.println(localArq.get(i));
        }


        String msg;
        while (true) {
            System.out.print("");
            msg = scan.readLine();
            if(msg.equals("/ll")) {
            System.out.println("-------- LOCAL LIST --------");
            for (int i = 0; i < localArq.size(); i++) {
                System.out.println(localArq.get(i));
            }
            System.out.println("-------- ******************* --------");
            msg = scan.readLine();
            }else if(msg.equals("/exit") || (msg.equals("/Exit")) || (msg.equals("/EXIT"))) {
                out.println(msg);
                size=localArq.size();
                out.println(size);
                for(int i=0;i<size;i++) {
                    out.println(localArq.get(i));
                }

            }
            else if(msg.equals("/get") || (msg.equals("/GET")) || (msg.equals("/Get"))) {
                System.out.println("Chose file's number to /get: ");
            c++;
            }
            if (done == true) {
                break;
            }
            out.println(msg);
    }
    } catch (UnknownHostException e) {
        System.out.println(e.getMessage());
    } catch (IOException e) {
        System.err.println(e.getMessage());
    }
}

@Override
public void run() {
    try {
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
        String rmsg;
        String req;

        while (true) {
            rmsg = in.readLine();
            if (rmsg == null) {
                System.out.println("Connection Terminated");
                break;
            }else if(rmsg.substring(rmsg.length() - 5).equals("idreq")) {

                req = in.readLine();
                for(int i=0;i<localArq.size();i++) { //IDENTIFIES WHO OWNS THE REQUESTED FILE
                    if(localArq.get(i).equals(req)) {

                        System.out.println("Owns requested file");
                        Socket requester = new Socket("192.168.3.114", 2007);
                        ObjectOutputStream outputr = new ObjectOutputStream(requester.getOutputStream());
                        ObjectInputStream inputr = new ObjectInputStream(requester.getInputStream());
                        Object mens= inputr.readObject();
                        System.out.println(mens);
                        outputr.writeObject("OWNER FOUND");
                    }
                }
                if(c==1) { //IDENTIFIES WHO WANTS THE FILE
                rmsg = in.readLine();
                c= Integer.parseInt(rmsg);
                System.out.println("file: "+req);

                ServerSocket peer = new ServerSocket(2007);
                System.out.println("OPEN FOR CONNECTIONS\n");

                    Socket client = peer.accept();
                    System.out.println("Client connected: " + client.getInetAddress().getHostAddress());
                    ObjectOutputStream outputo = new ObjectOutputStream(client.getOutputStream());
                    ObjectInputStream inputo = new ObjectInputStream(client.getInputStream());
                    outputo.flush();
                    outputo.writeObject("Connected to requester");
                    Object mens= inputo.readObject();
                    System.out.println(mens);

                }

            }
             else {
            System.out.println(rmsg);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    done = true;
}
}

1 Ответ

0 голосов
/ 13 ноября 2018

Мне удалось легко осуществить обмен данными между двумя клиентами с предоставленной информацией и небольшим исследованием stackOverflow, чтобы понять больше о out / inputStreams! Этот пост также мне очень помог: Отправка файла с помощью Java Sockets, потеря данных Следующим шагом является общий перевод

...