Файл приходит пустым, когда я пытаюсь передать между компьютерами с помощью сокетов

1

Привет, я относительно новичок в Java и очень новичок в сетевой стороне, и мне действительно нужна помощь....

Последние несколько дней я провел некоторое исследование, так как мало что знал о сети несколько дней назад. Есть похожие вопросы, которые были заданы, но я не могу получить ответ, чтобы помочь мне. Снова я очень новичок в java-сети и поэтому не знаю точно, как решить эту проблему. Пожалуйста помоги...

Я работаю над проектом с отношениями клиент/сервер, и я хочу, чтобы клиент мог передавать свои личные музыкальные файлы через сокет. Каждый раз, когда я пытаюсь сделать это, файл создается, но он пуст. Может ли кто-нибудь с сетевым опытом помочь мне, пожалуйста?

Код сервера:

 public class Server extends JFrame {


        //===============================
        // FIELDS
        //===============================

        // connection essentials
        private ServerSocket server;
        private Socket connection;
        private OutputStream outStream;
        private InputStream inStream;

        // file transfer essentials
        private FileInputStream fileInStream;
        private FileOutputStream fileOutStream;
        private BufferedInputStream bufInStream;
        private BufferedOutputStream bufOutStream;
        private int bytesRead;
        private int currentTot;

        // frame components
        private JTextArea textArea;
        private JButton ok;

        //===============================
        // CONSTRUCTORS
        //===============================

        public Server(){

            initComponents();

            try {
                runServer();
                getStreams();
                receiveFile();

            } catch (IOException ex) {

                System.out.print( "Error in constructor - Server" );
                Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
            } // catch()
            finally{

                try {
                    close();

                } catch (IOException ex) {
                    System.out.println( "Error in finally - attempt to close" );
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                } // catch()
            } // finally

        } // 0 Args  


        //===============================
        // CLASS METHODS
        //===============================

        private void runServer() throws IOException {

            *server = new ServerSocket( 7133, 100 );
            connection = server.accept(); // accept clients conn attempt
            textArea.setText( "Connection Established..." );
            //connection.setTcpNoDelay( true ); // stops nagles algorithm by 
            // halting buffering (waiting to receive confirmaion from client)

        } // runServer()

        private void getStreams() throws IOException{

            outStream = connection.getOutputStream();
            outStream.flush();

            inStream = connection.getInputStream();
            textArea.append( "\n\nReceiving files..." );

        } // getStreams()

        private void close() throws IOException{

            outStream.close();
            inStream.close();
            server.close();

        } // close()

        private void receiveFile() throws FileNotFoundException, IOException{

            byte byteArray[] = new byte[ 10000000 ];
            File receviedFile =  new File( "YES.mp3" );
            FileOutputStream FOS = new FileOutputStream( receviedFile );
            try (ByteArrayOutputStream BOS = new ByteArrayOutputStream()) {
                bytesRead = inStream.read(byteArray, 0, byteArray.length);
                currentTot = bytesRead;

                byteArray = BOS.toByteArray();

                do {
                    bytesRead = inStream.read(
                            byteArray, 0, (byteArray.length - currentTot));

                    if (bytesRead >= 0)
                        currentTot += bytesRead;

                    if(currentTot == byteArray.length )
                        textArea.append( "\n\nFile recieved" );



                } while (bytesRead > -1);

                BOS.write(byteArray, 0, currentTot);
                BOS.flush();
            }
            close();

        } // receiveFiles()

        private void initComponents() {

            // textArea
            textArea = new JTextArea();
            this.add( textArea, BorderLayout.CENTER );

            // send
            ok = new JButton( "OK" );
            this.add( ok, BorderLayout.SOUTH );

            addListeners();

            // frame fundamentals
            this.setVisible( true );
            this.setSize( 300, 150 );
            this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        } // initComponents()

        private void addListeners() {

            ok.addActionListener(
                new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent e) {

                        textArea.setText( "File received and accepted" );

                    } // actionPerformed()
                }); // addActionListeners()

        } // addListeners()
        //===============================
        // SETTERS AND GETTERS
        //===============================

        public static void main(String[] args) {

            Server server = new Server();
        }

    } // class{}

Код клиента:

public class Client extends JFrame {


    //===============================
    // FIELDS
    //===============================

    // connection essentials
    private Socket connection;
    private InputStream inStream;
    private OutputStream outStream;

    // file transfer essentials
    private FileInputStream fileInStream;
    private FileOutputStream fileOutStream;
    private BufferedInputStream bufInStream;
    private BufferedOutputStream bufOutStream;

    // frame components
    private JTextArea textArea;
    private JButton choose;
    private JButton send;

    // file
    private File fileToSend;


    //===============================
    // CONSTRUCTORS
    //===============================

    public Client(){

        initComponents();

        try {
            getConnected();
            getStreams();

        } catch (IOException ex) {
            System.out.println( "Error in Client constructor" );
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);

        } finally{

        } // finally

    }    
    //===============================
    // CLASS METHODS
    //===============================

    private void getConnected() throws IOException {

        connection = new Socket( InetAddress.getLocalHost(), 7133 );
        textArea.setText( "Connection Established..." );

    } // getConnected()

    private void getStreams() throws IOException {

        outStream = connection.getOutputStream();
        outStream.flush();

        inStream = connection.getInputStream();

    } // getStreams()

    private void close() throws IOException{

        outStream.close();
        inStream.close();
        connection.close();

    } // close()

    private void sendFile( final File transfer ) 
            throws FileNotFoundException, IOException{

        byte fileInBytes[] = new byte[ (int) transfer.length() ];
        fileInStream = new FileInputStream( transfer );
        int start = 0;

        textArea.setText( "Sending files...." );
        while( (start = inStream.read()) > 0 )
            outStream.write( fileInBytes, 0, fileInBytes.length );

        bufInStream = new BufferedInputStream( fileInStream );

        outStream.flush();

        textArea.setText( "Transfer complete" );
        close();

    } // sendFile()

    private void initComponents() {

        // choose
        choose = new JButton( "CHOOSE" );
        this.add( choose, BorderLayout.NORTH );

        // textArea
        textArea = new JTextArea();
        this.add( textArea, BorderLayout.CENTER );

        // send
        send = new JButton( "SEND" );
        this.add( send, BorderLayout.SOUTH );

        addListeners();

        // frame fundamentals
        this.setVisible( true );
        this.setSize( 300, 150 );
        this.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

    } // initComponents()

    private void addListeners() {

        choose.addActionListener(
            new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent e) {

                    getFile();

                } // actionPerformed()
            }); // addActionListeners()

        send.addActionListener(
            new ActionListener(){

                @Override
                public void actionPerformed(ActionEvent e) {
                    new Runnable(){

                        @Override
                        public void run() {

                            try {
                                sendFile(fileToSend);

                            } catch (IOException ex) {
                                System.out.println(
                                        "Error in send - actionPerformed");
                                Logger.getLogger(
                                        Client.class.getName()).log(
                                                Level.SEVERE, null, ex);

                            } // catch ()
                        } // run()
                    }; // runnable()

                } // actionPerformed()           
            }); // addActionListeners()

    } // addListeners()

   private void getFile()
   {
      JFileChooser fileChooser = new JFileChooser();
      fileChooser.setFileSelectionMode(
         JFileChooser.FILES_AND_DIRECTORIES );

      int result = fileChooser.showOpenDialog( this );

      // if user clicked Cancel button on dialog, return
      if ( result == JFileChooser.CANCEL_OPTION )
         System.exit( 1 );

      // getSelectedFile
      fileToSend = fileChooser.getSelectedFile();

      // display error if invalid
      if ( ( fileToSend == null ) || ( fileToSend.getName().equals( "" ) ) )
      {
         JOptionPane.showMessageDialog( this, "Invalid Name",
            "Invalid Name", JOptionPane.ERROR_MESSAGE );
         System.exit( 1 );
      } // end if

   } // end method getFile


    //===============================
    // SETTERS AND GETTERS
    //===============================

    public static void main(String[] args) {

        Client client = new Client();
    }

} // class{}
  • 0
    Вы делаете ряд нарушений потоков в Swing API. Посмотрите на Conurrency in Swing для деталей
  • 0
    Хорошо, человек, спасибо за информацию .. Я посмотрю и сортирую мой код .. ура ...
Теги:
sockets
swing

1 ответ

0
Лучший ответ

В вашем методе receiveFile() вы читаете первые 10 МБ того, что получилось - возможно, все - в byteArray. Затем в следующей строке:

byteArray = BOS.toByteArray();

Вы выбрасываете предыдущее значение byteArray включая все полученные вами данные, заменяя его пустым содержимым BOS.

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

  • 0
    Спасибо за быстрый ответ, я действительно ценю это. Это имеет большой смысл в том, что вы говорите мне, я собираюсь попробовать и реализовать это в коде сейчас, это может занять некоторое время, так как я не слишком уверен в этом процессе, но я опубликую свои результаты, когда добьюсь успеха. ,

Ещё вопросы

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