Передача файлов, но не удается загрузить в соответствующую программу запуска (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
}
}
}}