Передача файлов, но не удается загрузить в соответствующую программу запуска (Adobe Pdf) - Java Server Client

У меня есть проект, работающий на мой класс Java, я использую сокет. Да, я обращаюсь к онлайн-руководству за помощью, цель которого - прочитать файл на сервере типа pdf, а затем разрешить клиенту запрашивать этот файл у сервера.

Моя проблема Он запрашивает файл, но после того, как файл запрашивается и сохраняется на клиентском компьютере, когда я нажимаю на "Файл для запуска", Adobe говорит, что файл "Adobe не удалось открыть файл, поскольку он не поддерживается типом файла или потому, что файл был повреждение

Вот мой код Пожалуйста, я был бы признателен, если бы кто-нибудь мог мне помочь:

Код сервера:

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

public class SimpleFileServer {

 public final static String FILE_TO_SEND = "‪c:/Users/Acer/Downloads/COAFlags.pdf"; // you may change this

public static void main(String args[]) {

    while (true) {
        ServerSocket welcomeSocket = null;
        Socket connectionSocket = null;
        BufferedOutputStream outToClient = null;

        try {
            welcomeSocket = new ServerSocket(3248);
            connectionSocket = welcomeSocket.accept();
            outToClient = new BufferedOutputStream(connectionSocket.getOutputStream());
        } catch (IOException ex) {
            // Do exception handling
        }

        if (outToClient != null) {
            File myFile = new File( FILE_TO_SEND);
            byte[] mybytearray = new byte[(int)myFile.length()];

            FileInputStream fis = null;

            try {
                fis = new FileInputStream(myFile);
            } catch (FileNotFoundException ex) {
                // Do exception handling
            }
            BufferedInputStream bis = new BufferedInputStream(fis);

            try {
                bis.read(mybytearray, 0, mybytearray.length);
                outToClient.write(mybytearray, 0, mybytearray.length);
                outToClient.flush();
                outToClient.close();
                connectionSocket.close();

                // File sent, exit the main method
                return;
            } catch (IOException ex) {
                // Do exception handling
            }
        }
    }
}}

клиент

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

public class SimpleFileClient {

private final static String serverIP = "localhost";
public final static int FILE_SIZE = 55000;
private final static int serverPort = 3248;
private final static String fileOutput = "c:/Users/Acer/Downloads/sourcedownloaded.pdf";

public static void main(String args[]) {
    byte[] aByte = new byte[FILE_SIZE];
    int bytesRead;

    Socket clientSocket = null;
    InputStream is = null;

    try {
        clientSocket = new Socket( serverIP , serverPort );
        is = clientSocket.getInputStream();
    } catch (IOException ex) {
        // Do exception handling
    }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();

    if (is != null) {

        FileOutputStream fos = null;
        BufferedOutputStream bos = null;
        try {
            fos = new FileOutputStream( fileOutput );
            bos = new BufferedOutputStream(fos);
            bytesRead = is.read(aByte, 0, aByte.length);

            do {
                    baos.write(aByte);
                    bytesRead = is.read(aByte);
            } while (bytesRead != -1);

            bos.write(baos.toByteArray());
            bos.flush();
            bos.close();
            clientSocket.close();
        } catch (IOException ex) {
            // Do exception handling
        }
    }
}}

Файл, который я хотел передать, был 54KB хорошо, поэтому он не был вне диапазона.

2 ответа

Это не то, как ты это делаешь. Вы должны передать файл внутри цикла while, чтобы используемый вами буфер не занимал много памяти. Сторона сервера:

ServerSocket socket = new ServerSocket();
socket.bind(new InetSocketAddress("127.0.0.1",9200));
while(true) //that loop provides server non-stop sending, it will response to client requests till you terminate the application.
{
    Socket received = socket.accept();
    FileInputStream input = new FileInputStream("c:/Users/Acer/Downloads/COAFlags.pdf");
    OutputStream output = received.getOutputStream();
    int length;
    byte[] buffer = new byte[4096];

    while((length = input.read(buffer)) != -1)
    {
        output.write(buffer, 0, length);
    }

    output.close(); //no need to flush because close() already does it
    input.close();
}

Сторона клиента:

Socket socket = new Socket("127.0.0.1", 9200);
InputStream input = socket.getInputStream();
FileOutputStream output = new FileOutputStream("c:/Users/Acer/Desktop/abc.pdf");
int length;
byte[] buffer = new byte[4096];

while((length = input.read(buffer)) != -1)
{
    output.write(buffer, 0, length);
}

output.close();
input.close();

Примечание: размер буфера не является обязательным. 4096 обычно используется.

Новый код сервера:
импорт java.io. ; импорт java.net.;

открытый класс SimpleFileServer {

 public final static String FILE_TO_SEND = "‪c:/Users/Acer/Downloads/COAFlags.pdf"; // you may change this

public static void main(String args[]) {

    while (true) {
        ServerSocket welcomeSocket = null;
        Socket connectionSocket = null;
        OutputStream output = null;

        try {
            welcomeSocket = new ServerSocket(3248);
            connectionSocket = welcomeSocket.accept();
            output = connectionSocket.getOutputStream();
        } catch (IOException ex) {
            // Do exception handling
        }

        if (output != null) {



            try {
                int length;
                byte[] buffer = new byte[4096];
                FileInputStream input = new FileInputStream(FILE_TO_SEND);
                try {
                    while((length = input.read(buffer)) != -1)
                    {
                        output.write(buffer, 0, length);
                    }
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                try {
                    output.close();
                    input.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } //no need to flush because close() already does it

            } catch (FileNotFoundException ex) {
                // Do exception handling
            }



        }
    }
}}

Обновленный клиент

импорт java.io. ; импорт java.net.;

открытый класс SimpleFileClient {

private final static String serverIP = "localhost";
public final static int FILE_SIZE = 55000;
private final static int serverPort = 3248;
private final static String fileOutput = "c:/Users/Acer/Downloads/sourcedownloaded.pdf";

public static void main(String args[]) {
    byte[] buffer = new byte[55000];
    int length;

    Socket clientSocket = null;
    InputStream input = null;

    try {
        clientSocket = new Socket( serverIP , serverPort );
        input = clientSocket.getInputStream();
    } catch (IOException ex) {
        // Do exception handling
    }

   // ByteArrayOutputStream baos = new ByteArrayOutputStream();

    if (input != null) {


        FileOutputStream output = null;
        //BufferedOutputStream bos = null;
        try {
            output = new FileOutputStream( fileOutput );
            while((length = input.read(buffer)) != -1)
            {
                output.write(buffer, 0, length);
            }

            output.close();
            input.close();
        } catch (IOException ex) {
            // Do exception handling
        }
    }
}}
Другие вопросы по тегам