У меня есть проект, работающий для моего класса Java, я использую Socket Да, я смотрю онлайн-учебник для справки, цель - прочитать файл на сервере типа pdf, затем разрешите клиенту запрашивать этот файл из Sever.Передача файла Но не может загрузить в его соответствующей Launcher (Adobe Pdf) - Клиент сервера Java
My Issue Он запрашивает файл, но после того, как файл был запрошен и сохранен на клиентской машине, когда я попал в файл, который будет запускать 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 в порядке, поэтому он не был вне диапазона.
Обычные проблемы. Игнорирование длины, возвращаемой 'read();' попытка поместить весь файл в память; бессмысленное использование 'ByteArrayOutputStream;' ... – EJP
Что следует использовать, если byteArrayOutPutStream бесполезен – Redcode
Я не сказал, что это бесполезно. Я сказал, что вы использовали его бесцельно. Все, что вы пишете в 'ByteArrayOutputStream', можно записать непосредственно в' FileOutputStream'. То, как вы это делаете, просто расходует пространство и добавляет латентность. Также неправильный шаблон 'do/while': он будет писать мусор, если вход пуст. В самом деле, ваш код чаще всего обрабатывает нежелательные сообщения. См. Ответ @ farukdgn для правильного способа сделать это. – EJP