我创建了一个必须执行以下代码的小程序:



public class Example extends JApplet {
private ServerSocket ss ;
private Socket socket;
private boolean closed;

@Override
public void init(){
    try {
        new Example().initialize();
    } catch (IOException ex) {
        Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null,ex);
    }
}
public void closed(){
    System.out.println("Inside close");
    this.closed=true;
  }
public void initialize() throws IOException{
    ss =new ServerSocket(5002);
    while(!closed){
    System.out.println("Waiting to accept request");
    socket = ss.accept();
    System.out.println("Request accepted");
    }
}}


的HTML

执行小程序的HTML文件片段:

<script type="text/javascript" >
 function closeCall(){
 document.app.closed();
 }
 </script>
   <body>
<applet id="app" code="example.Example" archive="Example.jar" height="300" width="300">
   </applet>
   <input type="button" value="go" onClick="closeCall()" />


问题:单击“ Go”时,我的浏览器停止响应,并且javascript代码也没有错误。有什么方法可以调用document.app.closed();方法吗?

最佳答案

直到将代码转换为SSCCE 1后,许多问题才变得清晰起来:


这段代码对我来说没有任何JS标记就失败了。这向我表明这与JS无关!
调用Exampleinitialize()实例与applet实例不同! UI是否检测到JS并不重要,它不会停止正在运行的实例。
accept()阻止了EDT。
closed设置为true直到下一个客户端连接并且代码循环循环以再次检查closed属性的值时才起作用。我通过调用ss.close()实现了这一点(这使closed属性成为多余的BTW-但我将其保留了下来)。


BTW


请考虑在将来发布SSCCE。




试试这个版本:

// <applet code='Example' width=400 height=100></applet>
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.logging.*;

public class Example extends JApplet {
    private ServerSocket ss ;
    private Socket socket;
    private boolean closed;

    @Override
    public void init(){
        JButton stop = new JButton("Stop!");
        stop.addActionListener( new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                closed();
            }
        });
        add( stop );
        validate();

        Runnable r = new Runnable() {
            public void run() {
                try {
                    initialize();
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }

    public void closed() {
        System.out.println("Inside close");
        closed=true;
        try {
            ss.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    public void initialize() throws IOException {
        ss =new ServerSocket(5002);
        while(!closed){
            System.out.println("Waiting to accept request");
            socket = ss.accept();
            System.out.println("Request accepted");
        }
    }
}




我在此版本中添加了一个按钮,以便您可以在不使用JavaScript的情况下检查它是否按预期工作(在将JS混入之前,应先使用自己的代码进行检查)。 AppletVewer使用源顶部的单行注释将代码显示在屏幕上。像这样使用它:

prompt> appletviewer Example.java


典型输出

Waiting to accept request
Inside close
java.net.SocketException: socket closed
    at java.net.PlainSocketImpl.socketAccept(Native Method)
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408)
    at java.net.ServerSocket.implAccept(ServerSocket.java:462)
    at java.net.ServerSocket.accept(ServerSocket.java:430)
    at Example.initialize(Example.java:51)
    at Example$2.run(Example.java:27)
    at java.lang.Thread.run(Thread.java:662)

Tool completed successfully

关于java - 通过JavaScript杀死Applet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9781653/

10-11 12:53