0

没有收到“文件已成功接收”的消息,请帮助我。将文件从客户端传输到服务器时,即使收到文件,它也不会显示该消息。

它是使用套接字将文件从客户端传输到服务器的程序,并且接口也是使用 java swings 创建的,所以请帮我纠正错误

package Receiver;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
public class Receive extends JFrame {

public Receive() {

super("Packet hiding");
//Svr3.main();
setSize(350, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);

Container c = getContentPane();
c.setLayout(new FlowLayout());



JButton readyButton = new JButton("Ready");
JButton next = new JButton("Exit");

readyButton.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent ae) {
  try{
  ServerSocket server=new ServerSocket(127);
      Socket clientS=server.accept();
      Scanner read=new Scanner(System.in);
      Scanner scan=new Scanner(clientS.getInputStream());
      PrintWriter out=new PrintWriter(clientS.getOutputStream(),true);
      String idata,odata;
      int bytesRead;
      int current = 0;
      try
      {

        idata=scan.nextLine();
        String inp;
       inp = JOptionPane.showInputDialog(null, "Question: "+idata);

        odata=inp;
        out.println(odata);

         InputStream in = clientS.getInputStream();


    OutputStream output = new FileOutputStream("C:/Users/KRISHNASAI/Documents/NetBeansProjects/Proj1/src/Receiver/Encrypt.zip");

    byte[] buffer = new byte[1024];
    while ((bytesRead = in.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
    }
           JOptionPane.showMessageDialog(null,"File Recieved Sucessfully");

    // Closing the FileOutputStream handle
    output.close();
    scan.close();
            out.close(); 
            clientS.close();
            server.close();

             }
            catch(Exception e)
             {
              }

             System.out.println("conversation ended");


      }
  catch(Exception e)
       {

       }    
   }
   });

next.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
  try{
  Decrypt.main(null);

  System.exit(0);



}
   catch(Exception e)
       {
         }  
     }
     });


        c.add(readyButton);

        c.add(next);  


        }

        public static void main(String args[]) throws Exception{
        Receive s = new Receive();  
        s.setVisible(true);


     }


         }
4

2 回答 2

1
OutputStream output = new FileOutputStream("your file");

byte[] buffer = new byte[1024];
while ((bytesRead = in.read(buffer)) != -1) {
    output.write(buffer, 0, bytesRead);
}
       JOptionPane.showMessageDialog(null,"File Recieved Sucessfully");

Swing 执行事件(例如,ActionEvent)处理任务,包括在事件调度线程 (EDT) 中呈现 GUI。任何类型的任务往往需要更长的时间在该线程内执行将阻塞该线程,因此您的应用程序将被冻结(像死机一样卡住)。

  1. readyButton actionPerformed(ActionEvent)从函数中删除您的文件传输代码。

  2. 创建一个 Runnable 类,用必要的代码class FileTransferHandler extends Runnable覆盖它的功能。run()

  3. 单击时使用可运行类启动一个线程readyButton: 在actionPerformed函数内部执行:new Thread(new FileTransferHandler()).start()

除了这些变化,

 public static void main(String args[]) throws Exception{
        Receive s = new Receive();  
        s.setVisible(true);
     }

正如我所说的 GUI 渲染(更新)任务应该在 EDT 内完成。利用SwingUtilities.invokeLater(Runnable)函数将 GUI 渲染任务发布到 EDT。

SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               new Receive().setVisible(true);
            }
        });
于 2013-11-12T14:37:02.357 回答
0

可能你可以逐行设置“idata = scan.nextLine();”,step run会帮助你找到错误

于 2013-11-12T14:16:58.513 回答