我创建了一个必须执行以下代码的小程序:
码
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无关!
调用Example
的initialize()
实例与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/