Изпраща файлове от клиент към сървър

В кодовете по-долу се опитвам да позволя на страната на сървъра да избере файла от клиента и да го изпрати, така че основно цялата работа се извършва от страната на сървъра. програмата работи, като стартира сървъра, първо изчакайте клиента да стартира, осъществете връзка, след което сървърът изпраща мястото на файла към страната на клиента outReader.write("B://ghassar/ghassar.txt"); клиентът чете местоположението и изпраща файла. Пуснах отстраняването на грешки и след като сървърът прочете този код 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");

        }
    }
}

person moe    schedule 01.06.2014    source източник


Отговори (1)


Предлагам ви да използвате 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').

person Braj    schedule 01.06.2014