2012-06-11 3 views
0

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

Вот код сервера:

class TheServer { 

    public void setUp() throws IOException { // this method is called from Main class. 
     ServerSocket serverSocket = new ServerSocket(1991); 
     System.out.println("Server setup and listening..."); 
     Socket connection = serverSocket.accept(); 
     System.out.println("Client connect"); 
     System.out.println("Socket is closed = " + serverSocket.isClosed()); 



     BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

     String str = rd.readLine(); 
     System.out.println("Recieved: " + str); 
     rd.close(); 



     InputStream is = connection.getInputStream(); 

     int bufferSize = connection.getReceiveBufferSize(); 

     FileOutputStream fos = new FileOutputStream("C:/" + str); 
     BufferedOutputStream bos = new BufferedOutputStream(fos); 


     byte[] bytes = new byte[bufferSize]; 

     int count; 

     while ((count = is.read(bytes)) > 0) { 
      bos.write(bytes, 0, count); 
     } 

     bos.flush(); 
     bos.close(); 
     is.close(); 
     connection.close(); 
     serverSocket.close(); 


    } 
} 

и вот код клиента:

public class TheClient { 

    public void send(File file) throws UnknownHostException, IOException { // this method is called from Main class. 
     Socket socket = null; 
     String host = "127.0.0.1"; 

     socket = new Socket(host, 1991); 

     // Get the size of the file 
     long length = file.length(); 
     if (length > Integer.MAX_VALUE) { 
      System.out.println("File is too large."); 
     } 

     BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
     wr.write(file.getName()); 
     wr.flush(); 

     byte[] bytes = new byte[(int) length]; 
     FileInputStream fis = new FileInputStream(file); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream()); 

     int count; 

     while ((count = bis.read(bytes)) > 0) { 
      out.write(bytes, 0, count); 
     } 


     out.flush(); 
     out.close(); 
     fis.close(); 
     bis.close(); 
     socket.close(); 
    } 
} 

Я сделал несколько испытаний моей собственной, и кажется, что мой клиент посылает на имя file right, но почему-то сервер ошибается. Например, если мой клиент говорит, что имя файла «test.txt», мой сервер получает его, например, как «test.txt» -------------------- " или "test.txtPK". Я не понимаю, почему это имя не получило. Кто-нибудь знает, почему это происходит? Или есть более простой способ сделать это? И мой второй вопрос: как я могу использовать это не только в localhost, но и везде? Я попытался изменить свой хост на свой IP-адрес, но он не работал. Благодарю.

ответ

3

Вы никогда не отправляете конец строки после имени файла. Поэтому, когда сервер читает с помощью readLine(), он будет читать все символы, пока не найдет первый конец строки, который может быть где-то в содержимом файла. Иногда это происходит после «-----», а иногда и после «ПК».

+0

Не могли бы вы показать мне, как это сделать? –

+0

Просто вызовите 'wr.newLine()' после 'wr.write (file.getName())'. Возможно, я бы использовал некоторую библиотеку, такую ​​как Apache Commons IO. Он содержит множество полезных утилит поверх классов 'java.io'. –

+0

Это отлично поработало! благодаря –

Смежные вопросы