3

クライアントからサーバーにファイルをアップロードする GUI アプリケーションを作成したいのですが、助けてください。参照ボタンをクリックすると、ネットワーク上でデータをバイト単位で移動するため、ファイルはバイト形式でコピーされますが、アップロードボタンをクリックするとファイルをアップロードできません。

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

class ClientUpload extends JFrame implements ActionListener {

    JFileChooser fc;
    JButton b, b1;
    JTextField tf;
    FileInputStream in;
    Socket s;
    DataOutputStream dout;
    DataInputStream din;
    int i;

    ClientUpload() {
        super("client");
        tf = new JTextField();
        tf.setBounds(20, 50, 190, 30);
        add(tf);

        b = new JButton("Browse");
        b.setBounds(250, 50, 80, 30);
        add(b);
        b.addActionListener(this);
        b1 = new JButton("Upload");
        b1.setBounds(250, 100, 80, 30);
        add(b1);
        b1.addActionListener(this);
        fc = new JFileChooser();
        setLayout(null);
        setSize(400, 300);
        setVisible(true);
        try {
            s = new Socket("localhost", 10);
            dout = new DataOutputStream(s.getOutputStream());
            din = new DataInputStream(s.getInputStream());
            send();
        } catch (Exception e) {
        }
    }

    public void actionPerformed(ActionEvent e) {
        try {
            if (e.getSource() == b) {
                int x = fc.showOpenDialog(null);
                if (x == JFileChooser.APPROVE_OPTION) {
                    copy();
                }
            }
            if (e.getSource() == b1) {
                send();
            }
        } catch (Exception ex) {
        }
    }

    public void copy() throws IOException {
        File f1 = fc.getSelectedFile();
        tf.setText(f1.getAbsolutePath());
        in = new FileInputStream(f1.getAbsolutePath());
        while ((i = in.read()) != -1) {
            System.out.print(i);
        }
    }

    public void send() throws IOException {
        dout.write(i);
        dout.flush();

    }

    public static void main(String... d) {
        new ClientUpload();
    }
}
4

2 に答える 2

3

基本的に、ファイルを選択したときにファイルの内容を読み取り、内容を破棄してから、最後intに読み取った値をサーバーに送信しようとします。ファイルの長さは、非常に多く、何バイトにもなり (ギガバイトと考えてください)、intins にはそれほど多くの情報を保持することはできません (貧弱intです)。

代わりに、ユーザーが を選択するFileと、実際に必要になるまで参照を維持する必要があります...

public void actionPerformed(ActionEvent e) {
    try {
        if (e.getSource() == b) {
            int x = fc.showOpenDialog(null);
            if (x == JFileChooser.APPROVE_OPTION) {
                fileToBeSent = fc.getSelectedFile();
                tf.setText(f1.getAbsolutePath());
                b1.setEnabled(true);
            } else {
                fileToBeSent = null;
                tf.setText(null;);
                b1.setEnabled(false);
            }
        }
        if (e.getSource() == b1) {
            send();
        }
    } catch (Exception ex) {
    }
}

ユーザーが「送信」ボタンを押すと、ファイル入力ストリームをソケット出力ストリームにコピーするだけです...

FileInputStream in = null;
try {
    in = new FileInputStream(fileToBeSent);
    byte[] buffer = new byte[1024];
    int bytesIn = -1;
    while ((bytesIn = in.read(buffer)) != -1) {
        dout.write(buffer, 0, bytesIn);
    }
    dout.flush();
} finally {
    try {
        in.close();
    } catch (Exception exp) {
    }
}

そうすれば、少なくとも一歩近づくはずです。

次に遭遇する可能性が高い問題は、転送の進行中に UI が応答を停止するという事実です。

この場合、Concurrency in Swingを確認する必要があります。

最新の UI では、さまざまなフォント、フォント レンダリング機能、DPI、画面解像度など、クライアント マシンのさまざまな特性に対処する必要があります。絶対レイアウトを使用することで、非常に暗くて深い穴に自分自身を入れています。

これらの懸念のプレッシャーを軽減し、UI をさまざまな操作環境により適応させるように設計されたレイアウト マネージャー API を利用する必要があります。

詳細については、コンテナ内のコンポーネントのレイアウトをご覧ください。

詳細については、 Basic I/OおよびAll about socketsを詳しく調べてください...

于 2013-10-03T06:50:28.667 に答える
1

このコードをコピーして貼り付けるだけで、これが役立ちます....

これはサーバークラスです

package newpack;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

public class SwingControlServer extends JFrame {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JPanel contentPane;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    SwingControlServer frame = new SwingControlServer();
                    frame.setVisible(false);
                    frame.start();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    protected static void start() throws IOException {
        // TODO Auto-generated method stub
         System.out.println("Server running...");
         
            /* Listen on port 5555 */
     
            ServerSocket server = new ServerSocket(10001);
     
            /* Accept the sk */
     
            Socket socket = server.accept();
           
            System.out.println("Server accepted client");
            InputStream inputStream=socket.getInputStream();
            byte[] readbyte=new byte[(1024*10)*1024];           
            
                
            FileOutputStream fileOutputStream=new FileOutputStream("D:/Manoj/hello21.zip");
            int writebyte;
            int count=0;
            while((writebyte=inputStream.read(readbyte))!=-1)
            {
                if(writebyte>0)
                    count+=writebyte;
                fileOutputStream.write(readbyte, 0, writebyte);
            }
            
            //System.out.println("THE WRITEBYTE VALUE IS "+writebyte+"THE READ BYTE VALUE IS"+count);
            inputStream.close();
            System.out.println("CONNECTION CLOSED");
            

        
    }

    /**
     * Create the frame.
     */
    public SwingControlServer() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        contentPane.setLayout(new BorderLayout(0, 0));
        setContentPane(contentPane);
        
        
    }


}

これはクライアントクラスです

package newpack;

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.StringTokenizer;

import javax.swing.*;

import org.apache.commons.io.FileUtils;


 
public class SwingControlDemo extends JFrame {
    
   /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private JFrame mainFrame;
   private JPanel controlPanel;
   private String filename;
   private String fname;
   private JProgressBar progressBar;
   private Task task;
   private JButton startButton;
   private JTextArea outputTextArea;
   private JTextField textField;
   private JLabel lblFilename;
   private JButton btnNewButton;
   private JButton btnCancel;
   private JLabel sendinglabel;
   private JLabel starttime;
   private JLabel endtime;
private JLabel sendinglabel1;
   
   
   public SwingControlDemo(){
      prepareGUI();
   }

   public static void main(String[] args){
      SwingControlDemo  swingControlDemo = new SwingControlDemo();      
      swingControlDemo.showProgressBarDemo();
   }

   private void prepareGUI(){
      mainFrame = new JFrame("Large File Upload");
      mainFrame.setSize(492,400);
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });
      mainFrame.getContentPane().setLayout(null);

      controlPanel = new JPanel();
      controlPanel.setBounds(0, 0, 491, 355);
      mainFrame.getContentPane().add(controlPanel);
      controlPanel.setLayout(null);
      mainFrame.setVisible(true);  
   }

   
   
   private void showProgressBarDemo(){
      controlPanel.setLayout(null);
      
      textField = new JTextField();
      textField.setBounds(125, 26, 105, 31);
      controlPanel.add(textField);
      textField.setColumns(10);
      
        sendinglabel=new JLabel("FIle is Sending...");
        sendinglabel.setBounds(10, 128, 168, 30);
        sendinglabel.setVisible(false);
        sendinglabel.setFont(new Font("Times New Roman", Font.PLAIN, 12));
        controlPanel.add(sendinglabel);
        
        sendinglabel1=new JLabel("FIle is Sending...");
        sendinglabel1.setBounds(51, 200, 250, 30);
        sendinglabel1.setVisible(false);
        sendinglabel1.setFont(new Font("Times New Roman", Font.PLAIN, 12));
        controlPanel.add(sendinglabel1);
        
        
        endtime = new JLabel("");
        endtime.setBounds(204, 200, 208, 33);
        endtime.setFont(new Font("Times New Roman", Font.PLAIN, 14));
        controlPanel.add(endtime);
        
        
        starttime = new JLabel("");
        starttime.setBounds(273, 141, 208, 33);
        starttime.setFont(new Font("Times New Roman", Font.PLAIN, 14));
        controlPanel.add(starttime);
        
      ProgressMonitor pc=new ProgressMonitor(SwingControlDemo.this, "Running My Program","", 0,10);
      
            
                  progressBar = new JProgressBar(0, 100);
                  progressBar.setBounds(62, 158, 146, 31);
                  progressBar.setValue(0);
                  progressBar.setStringPainted(true);
                  controlPanel.add(progressBar);
                  
                  
                  startButton = new JButton("Send");
                  startButton.setBounds(75, 82, 90, 31);
                  startButton.addActionListener(new ActionListener() {
                  private int i;

                @Override
                
                  public void actionPerformed(ActionEvent e) {
                    
                    task = new Task();                
                    task.start();
                    
                }});
                  
                        controlPanel.add(startButton);
                        
                              outputTextArea = new JTextArea("",5,20);
                              outputTextArea.setVisible(false);
                              outputTextArea.setBounds(51, 200, 164, 94);
                              controlPanel.add(outputTextArea);
                              
                              lblFilename = new JLabel("FileName");
                              lblFilename.setVisible(true);
                              lblFilename.setBounds(10, 26, 105, 31);
                              lblFilename.setFont(new Font("Times New Roman", Font.PLAIN, 14));
                              controlPanel.add(lblFilename);
                              
                              
                              btnNewButton = new JButton("Browse");
                              btnNewButton.setBounds(258, 26, 105, 31);
                              btnNewButton.addActionListener(new ActionListener() {
                                

                                

                                public void actionPerformed(ActionEvent arg0) {
                                    
                                    JFileChooser filedilg=new JFileChooser();
                                    filedilg.showOpenDialog(filedilg);
                                    filename=filedilg.getSelectedFile().getAbsolutePath();
                                    textField.setText(filename);
                                    
                                    File file1=new File(filename);
                                    fname = file1.getName();           
                                    System.out.println("THE FILE NAME IS "+fname);
                                }
                              });
                              btnNewButton.setFont(new Font("Times New Roman", Font.PLAIN, 14));
                              controlPanel.add(btnNewButton);
                              
                              btnCancel = new JButton("Cancel");
                              btnCancel.setBounds(182, 82, 90, 31);
                              btnCancel.addActionListener(new ActionListener() {
                                
                                @Override
                                public void actionPerformed(ActionEvent arg0) {
                                    // TODO Auto-generated method stub
                                System.exit(0); 
                                }
                            });
                              controlPanel.add(btnCancel);
                              mainFrame.setVisible(true);  
   }

   private class Task extends Thread {    
      public Task(){   }     

    public void run(){       
        
        PrintStream ps = null;      
        if(filename!=null)
        {
            DateFormat df=new SimpleDateFormat("HH:mm:ss");
            Calendar c=Calendar.getInstance();
            String starttime=df.format(c.getTime());
            System.out.println("Start time: "+starttime);
            
         try{
//To get current working directory
            String workingdirectory=System.getProperty("user.dir");
            System.out.println(workingdirectory);
//Create folder name as LogFolder in workingdirectory
            File file1=new File(workingdirectory+"\\LogFolder\\");
            
            File f2 = null;         
            //if folder not present we need to create a folder
            if (!file1.exists()) {
                if (file1.mkdir()) {
                    f2=new File(file1, "abc.txt");
                    System.out.println("Directory is created!");
                } else {
                    System.out.println("Failed to create directory!");
                }
                
            }f2=new File(file1, "abc.txt");
            ps=new PrintStream(f2);
            
                /* Try to connect to the server on localhost, port 5555 */
            sendinglabel.setVisible(true);
            SwingControlDemo.this.starttime.setText("Start time: "+starttime);
             
            JOptionPane.showMessageDialog(rootPane, "File is Sending...!!!");
            
          
           
            
            
            
                Socket socket=new Socket("localhost",10001);
                
                File file=new File(filename);
                             
               
              
                
                 
                double size=(file.length()/(1024*1024));
                //float size1=(float)size;  
                
                System.out.println("THE FILE SIZE IS "+size);
                //iterate();

                

                    byte[] mybyte=new byte[(int) file.length()];
                    
                    FileInputStream fileInputStream=new FileInputStream(file);
                    int count;
                    int i=0;
                    OutputStream outputStream=socket.getOutputStream();
                    
                    while((count=fileInputStream.read(mybyte))!=-1)
                    {
                        outputStream.write(mybyte);
                        i+=1;
                        
                        System.out.print("FIle Sent........"+i+"Kilobytes \t");
                        myFun(i, size);
                        
                    
                    
                }
                System.out.println();
                
                DateFormat df1=new SimpleDateFormat("HH:mm:ss");
                Calendar c1=Calendar.getInstance();
                String endtime=df1.format(c1.getTime());
                System.out.println("End time is : "+endtime);
                
                JOptionPane.showMessageDialog(rootPane, "File Sent Successfully!!!!\n Start Time is :"+starttime+"\n End Time Is : "+endtime);
                SwingControlDemo.this.endtime.setText(endtime);
                System.out.println("THIS FILE HAS BEEN SENT SUCCESSFULLY!!!");      
                
                

                socket.close();
                System.exit(1);
                
            

            }
        
            catch (Exception ex){
                /* Catch any errors */

                JOptionPane.showMessageDialog(rootPane, "Error While Sending File : "+ex.getMessage());
                ex.printStackTrace(ps);
                
            }
        }
        else
        {
            JOptionPane.showMessageDialog(rootPane, "Please Choose a Valid File");
        }
                    
        
        
        
        
         
      }

    private  void myFun(int j,Double mbsize) {
        // TODO Auto-generated method stub
        
        int per=(int) ((j*100)/mbsize);
        System.out.println("THE INTEGER VALUE IS "+per);
        if(j<mbsize)
        {
            System.out.println("INSIDE IF LOOP");
            progressBar.setValue(per);
            
        }
        else
        {
            progressBar.setValue(per);
            
        }
        try {
            Thread.sleep(10);
            
           
         } catch (InterruptedException e) {}
         
      }
        
    }
   }   
于 2014-04-09T06:50:37.360 に答える