Отправляет файлы с клиента на сервер

1

В приведенных ниже кодах я пытаюсь позволить серверной стороне выбрать файл с клиента и отправить его, так что в основном вся работа выполняется на стороне сервера. программа работает, запустив сервер, чтобы дождаться, пока клиент запустится, сделайте соединение, затем сервер отправит место файла на стороне клиента outReader.write("B://ghassar/ghassar.txt"); клиент считывает местоположение и отправляет файл. Я запустил debug, и как только сервер прочитает этот код String filename = inReader.readLine(); он останавливается, и он попадает в петлю, может ли кто-нибудь помочь мне решить проблему

/ Server.java

/*
 * Server waits for a connection to be established by client
 *
 */

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

class Server
{
    public static void main(String args[])throws Exception
    {
        System.out.println("Server running...");

        /* Listen on port 5555 */

        ServerSocket server = new ServerSocket(222);

        /* Accept the sk */

        Socket sk = server.accept();

        System.out.println("Server accepted client");
        // to recive from client
        InputStream input = sk.getInputStream();
        //read what is coming
        BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));
        //write to client
        BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
            outReader.write("B://ghassar/ghassar.txt");
            outReader.flush();
        /* Read the filename */
        String filename = inReader.readLine();

        if (filename.equals("ghassar.txt") ){

            /* Reply back to client with READY status */

            outReader.write("READY\n");
            outReader.flush();
        }

        /* Create a new file in the libya directory using the filename */
        FileOutputStream wr = new FileOutputStream(new File("B://libya/ "+ filename));

        byte[] buffer = new byte[sk.getReceiveBufferSize()];

        int bytesReceived = 0;

        while((bytesReceived = input.read(buffer))>0)
        {
            /* Write to the file */
           wr.write(buffer,0,bytesReceived);
        }
    }
}


import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class Client  {
    public static void main(String args[]){



        Client clientForm = new Client();
        clientForm.action();

    }
    public void action() {


        try{

            /* Try to connect to the server on localhost, port 5555 */

            Socket sk = new Socket("localhost", 222);
            OutputStream output = sk.getOutputStream();

            /* the steam to send the staff*/

            OutputStreamWriter outputStream = new OutputStreamWriter(sk.getOutputStream());

            /* steam to recive staff */

            BufferedReader inReader = new BufferedReader(new InputStreamReader(sk.getInputStream()));

               String serverStatus = inReader.readLine(); // Read the first line
               String filename =  serverStatus;//fileDlg.getSelectedFile().getAbsolutePath();
               outputStream.write("ghassar.txt");
               outputStream.flush();

            /* If server is ready, send the file */

            if ( serverStatus.equals("READY") ){

                FileInputStream file = new FileInputStream(filename);

                byte[] buffer = new byte[sk.getSendBufferSize()];

                int bytesRead = 0;

                while((bytesRead = file.read(buffer))>0)
                {
                    output.write(buffer,0,bytesRead);
                }

                output.close();
                file.close();
                sk.close();
               System.out.println("File sent");

            }
        }
        catch (Exception ex){
            /* Catch any errors */
                 System.out.println("not File sent");

        }
    }
}
Теги:
io
ftp
client-server
file-transfer

1 ответ

0

Я предлагаю вам использовать PrintWriter вместо BufferedWriter. Не нужно вызывать флеш после каждой строки и просто использовать метод println() вместе с функцией автозапуска, чтобы добавить новую строку.

В отличие от класса PrintStream, если включена автоматическая промывка, это будет сделано только при вызове одного из методов println, printf или format, а не всякий раз, когда выводится символ новой строки.

Эти методы используют платформенное понятие разделителя строк, а не символ новой строки.

Нет необходимости добавлять \n в самом сообщении.

Образец кода:

// here true means auto flush when 'println()' method is called
PrintWriter w=new PrintWriter(new OutputStreamWriter(sk.getOutputStream()),true);
w.println(message);

Возможная причина в коде:

Проблема может быть в нижних строках, где \n не добавляется в конце строки в методе write() перед очисткой, а на стороне клиента используется метод readLine() для чтения.

BufferedWriter outReader = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
outReader.write("B://ghassar/ghassar.txt"); 
outReader.flush();

Примечание: вы можете использовать BufferedWriter # newLine() вместо \n который записывает разделитель строк. Строка разделителя строк определяется системным свойством line.separator и не обязательно является символом новой строки ('\n').

Ещё вопросы

Сообщество Overcoder
Наверх
Меню