Только после того, как этот код превратился в SSCCE 1 , многие проблемы стали понятны:
- Этот код провалился для меня безо всяких признаковиз JS.Это указывает на то, что это не имеет ничего общего с JS! . Экземпляр
Example
, для которого был вызван initialize()
, был не таким, как этот.который был апплет!Не имело значения, обнаружил ли пользовательский интерфейс JS, он не остановил бы запущенный экземпляр. accept()
блокировал EDT. - Установка
closed
в true
не собирался оказывать влияние до тех пор, пока следующий клиент не подключился и код не зациклился, чтобы снова проверить значение атрибута closed
.Я добился этого, вызвав ss.close()
(что делает атрибут closed
избыточным, но я оставил его).
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