2015-02-02 2 views
0

У меня есть проект, работающий для моего класса 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 в порядке, поэтому он не был вне диапазона.

+0

Обычные проблемы. Игнорирование длины, возвращаемой 'read();' попытка поместить весь файл в память; бессмысленное использование 'ByteArrayOutputStream;' ... – EJP

+0

Что следует использовать, если byteArrayOutPutStream бесполезен – Redcode

+0

Я не сказал, что это бесполезно. Я сказал, что вы использовали его бесцельно. Все, что вы пишете в 'ByteArrayOutputStream', можно записать непосредственно в' FileOutputStream'. То, как вы это делаете, просто расходует пространство и добавляет латентность. Также неправильный шаблон 'do/while': он будет писать мусор, если вход пуст. В самом деле, ваш код чаще всего обрабатывает нежелательные сообщения. См. Ответ @ farukdgn для правильного способа сделать это. – EJP

ответ

1

Это не то, как вы это делаете. Вы должны перенести файл внутри цикла 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.

+0

Хорошо, а теперь попробуй, и возвращайся к тебе – Redcode

+0

Хорошо, я отредактировал свой код с добавлением, которое вы сказали, но я не получил никого, где бы вы могли сказать мне, добавил ли я код, который вы подразумеваете неправильно – Redcode

+0

Я добавил полный код, чтобы вы можно скопировать пасту и попробовать их, а затем проанализировать. – farukdgn

0

Код нового сервера:
импорт 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 
     } 
    } 
}} 
+0

Это код Above @farukdgn – Redcode