Запрос конкретного файла с сервера через сокет в Java - PullRequest
2 голосов
/ 26 апреля 2011

Я нашел некоторый код, который передает файлы между клиентом и сервером.Но местоположение файла и номера портов жестко закодированы.Мне было интересно, есть ли способ, которым клиент может указать, какой файл ему / ей нужен от сервера - чтобы сервер, получив запрос, мог отправить этот конкретный файл клиенту.Спасибо.


Редактировать [1]: Фрагмент кода и описание контекста:

Я добавляю код, который у меня есть, основываясь на отзывах и комментариях.Надеюсь, это ответит на некоторые вопросы в разделе комментариев.

import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Original coder adapted from:
 * http://www.rgagnon.com/javadetails/java-0542.html
 *
 * Best intentions:
 * This program runs both as server and client.
 * 
 * The client asks for a specific file from _
 * the server x number of times in a loop.
 * 
 * Server simply serves the file requested.
 */

public class FileServer extends Thread {

    public static void server() throws IOException {
        ServerSocket servsock = new ServerSocket(13267);
        while (true) {
            System.out.println("Waiting...");

            Socket sock = servsock.accept();
            System.out.println("Accepted connection : " + sock);

            //Retrieve filename to serve
            InputStream is = sock.getInputStream();
            BufferedReader bfr = new BufferedReader(new InputStreamReader(is));
            String fileName = bfr.readLine();
            bfr.close();

            System.out.println("Server side got the file name:" + fileName);

            //Sendfile
            File myFile = new File(fileName);
            byte[] mybytearray = new byte[(int) myFile.length()];
            FileInputStream fis = new FileInputStream(myFile);
            BufferedInputStream bis = new BufferedInputStream(fis);
            bis.read(mybytearray, 0, mybytearray.length);
            OutputStream os = sock.getOutputStream();
            System.out.println("Sending...");
            os.write(mybytearray, 0, mybytearray.length);
            os.flush();
            sock.close();
        }
    }

    public static void client(int index) throws IOException {
        int filesize = 6022386; // filesize temporary hardcoded

        long start = System.currentTimeMillis();
        int bytesRead;
        int current = 0;
        //Localhost for testing
        Socket sock = new Socket("127.0.0.1", 13267);

        System.out.println("Connecting...");

        //Ask for specific file: source1
        String fileName = "source1";
        OutputStream os = sock.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        pw.println(fileName);


        //Receive file
        byte[] mybytearray = new byte[filesize];
        InputStream is = sock.getInputStream();
        FileOutputStream fos = new FileOutputStream("source1-copy" + index);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        bytesRead = is.read(mybytearray, 0, mybytearray.length);
        current = bytesRead;

        // thanks to A. Cádiz for the bug fix
        do {
            bytesRead =
                    is.read(mybytearray, 
                            current, (mybytearray.length - current));
            if (bytesRead >= 0) {
                current += bytesRead;
            }
        } while (bytesRead > -1);

        bos.write(mybytearray, 0, current);
        bos.flush();

        long end = System.currentTimeMillis();
        System.out.println(end - start);
        os.flush();

        bos.close();
        sock.close();
    }

    public static void main(String[] args) throws IOException {

        FileServer fs = new FileServer();
        fs.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(
                   FileServer.class.getName()).log(Level.SEVERE, null, ex);
        }

        for (int i = 0; i < 5; i++) {
            client(i);
        }

    }

    @Override
    public void run() {
        try {
            server();
        } catch (IOException ex) {
            Logger.getLogger(
                   FileServer.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Когда я запускаю этот код, он застревает в строке «Соединение ...».Вот вывод:

Ожидание ...
Допустимое соединение: сокет [адрес = / 127.0.0.1, порт = 44939, локальный порт = 13267]
Соединение ...

1 Ответ

2 голосов
/ 26 апреля 2011

@ moejoe Я думаю, что вы слишком обдумываете это.

Если у вас уже есть возможность отправить файл, то первое, что нужно сделать, это абстрагировать эту функциональность, чтобы вы могли запустить ее какметод и укажите путь / имя файла.

Затем вы можете использовать сокет (который является двухсторонним), чтобы отправить сообщение от клиента на сервер, спрашивая, какой файл вы хотите.Кроме того, вопрос заключается в том, как получить нужный файл из пользовательского интерфейса.Вам может потребоваться, чтобы сервер предоставил метод «список доступных файлов», то есть функциональность ls.

Это все довольно тривиально для реализации.

...