Как я могу передавать файлы со стороны сервера на клиент с помощью сокетов? - PullRequest
1 голос
/ 23 февраля 2011

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

Вот мой код на стороне клиента:

package V3;

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

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

        Socket kkSocket = null;
        PrintWriter out = null;
        BufferedReader in = null;

        try {
            kkSocket = new Socket("localhost", 4444);
            out = new PrintWriter(kkSocket.getOutputStream(), true);
            in = new BufferedReader(new InputStreamReader(kkSocket.getInputStream()));
        } catch (UnknownHostException e) {
            System.err.println("Don't know about host: taranis.");
            System.exit(1);
        } catch (IOException e) {
            System.err.println("Couldn't get I/O for the connection to: taranis.");
            System.exit(1);
        }

        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String fromServer;
        String fromUser;

        while ((fromServer = in.readLine()) != null) {
            System.out.println("Server: " + fromServer);
            if (fromServer.equals("Bye."))
                break;

            fromUser = stdIn.readLine();
        if (fromUser != null) {
                System.out.println("Client: " + fromUser);
                out.println(fromUser);
        }
        }

        out.close();
        in.close();
        stdIn.close();
        kkSocket.close();
    }
}

А вот мой код на стороне сервера:

package V3;

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

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

        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(4444);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 4444.");
            System.exit(-1);
        }

        while (listening)
        new Version3ServerThread(serverSocket.accept()).start();

        serverSocket.close();

        Socket clientSocket = null;
        try {
            clientSocket = serverSocket.accept();
        } catch (IOException e) {
            System.err.println("Accept failed.");
            System.exit(1);
        }

        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(
                new InputStreamReader(
                clientSocket.getInputStream()));
        String inputLine, outputLine;
        Version3Protocol kkp = new Version3Protocol();

        outputLine = kkp.processInput(null);
        out.println(outputLine);

        while ((inputLine = in.readLine()) != null) {
             outputLine = kkp.processInput(inputLine);
             out.println(outputLine);
             if (outputLine.equals("Bye."))
                break;
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

Добавлен класс потока для дальнейшей спецификации:

package V3;
    import java.net.*;
    import java.io.*;
    import java.io.FileWriter;

    public class Version3ServerThread extends Thread {
        private Socket socket = null;

        public Version3ServerThread(Socket socket) {
        super("Version3ServerThread");
        this.socket = socket;
        }

        public void run() {

        try {
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                        new InputStreamReader(
                        socket.getInputStream()));

            String inputLine, outputLine;
            Version3Protocol kkp = new Version3Protocol();
            outputLine = kkp.processInput(null);
            out.println(outputLine);

            while ((inputLine = in.readLine()) != null) {
            outputLine = kkp.processInput(inputLine);
            out.println(outputLine);
            if (outputLine.equals("Bye"))
                break;
                    if(kkp.getInteraction()){
                      Logging.writeToFile(socket.getInetAddress());
                    }
            }
            out.close();
            in.close();
            socket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
        }
    }

1 Ответ

0 голосов
/ 23 февраля 2011

Код до сих пор, клиент-сервер-связь без возможности передачи файлов, выглядит хорошо для меня. Я хотел скомпилировать, чтобы найти ошибки, но вы не включили Version3Protocol и Logging. Если это произойдет, то следующим шагом будет открытие файла, который вы хотите передать на сервер, с помощью FileInputStream и нового файла для записи на клиенте с помощью FileOutputStream:

http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileInputStream.html http://download.oracle.com/javase/1.4.2/docs/api/java/io/FileOutputStream.html

Затем вы можете прочитать файл в буфер, передать его с помощью сокета, получить его на стороне клиента и скопировать содержимое буфера в FileOutputStream там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...