Salve. Ho un problema... allora, l'applet viene caricata correttamente, ma quando vado a cliccare sul JButton per avviare una classe che estende JFrame, mi si blocca tutto e non riesco più a chiudere... perchè fa così?
server.html
codice:
<html>
<applet code = "ServerApplet.class" width = "120" height = "50"></applet>
</html>
Server.java
codice:
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Server extends JFrame
{
private JTextField enterField;
private JTextArea displayArea;
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;
private int counter = 1;
public Server()
{
super ("Server");
setSize (300, 150);
setLocationRelativeTo (null);
setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
enterField = new JTextField();
enterField.setEditable (false);
enterField.addActionListener
(
new ActionListener()
{
public void actionPerformed (ActionEvent event)
{
sendData (event.getActionCommand());
enterField.setText ("");
}
}
);
add (enterField, BorderLayout.NORTH);
displayArea = new JTextArea();
add (new JScrollPane (displayArea), BorderLayout.CENTER);
setVisible (true);
}
public void runServer()
{
try
{
server = new ServerSocket (12345, 100);
while (true)
{
try
{
waitForConnection();
getStreams();
processConnection();
}
catch (EOFException exception)
{
displayMessage ("\nServer terminated connection");
}
finally
{
closeConnection();
counter++;
}
}
}
catch (IOException exception)
{
exception.printStackTrace();
}
}
private void waitForConnection() throws IOException
{
displayMessage ("Waiting for connection\n");
connection = server.accept();
displayMessage ("Connection " + counter + " received from: " + connection.getInetAddress().getHostName());
}
private void getStreams() throws IOException
{
output = new ObjectOutputStream (connection.getOutputStream());
output.flush();
input = new ObjectInputStream (connection.getInputStream());
displayMessage ("\nGot I/O streams\n");
}
private void processConnection() throws IOException
{
String message = "Connection successful";
sendData (message);
setTextFieldEditable (true);
do
{
try
{
message = (String) input.readObject();
displayMessage ("\n" + message);
}
catch (ClassNotFoundException exception)
{
displayMessage ("\nUnknown object type received");
}
} while (!message.equals ("CLIENT>>> TERMINATE"));
}
private void closeConnection()
{
displayMessage ("\nTerminating connection\n");
setTextFieldEditable (false);
try
{
output.close();
input.close();
connection.close();
}
catch (IOException exception)
{
exception.printStackTrace();
}
}
private void sendData (String message)
{
try
{
output.writeObject ("SERVER>>> " + message);
output.flush();
displayMessage ("\nSERVER>>> " + message);
}
catch (IOException exception)
{
displayArea.append ("\nError writing object");
}
}
private void displayMessage (final String messageToDisplay)
{
SwingUtilities.invokeLater
(
new Runnable()
{
public void run()
{
displayArea.append (messageToDisplay);
}
}
);
}
private void setTextFieldEditable (final boolean editable)
{
SwingUtilities.invokeLater
(
new Runnable()
{
public void run()
{
enterField.setEditable (editable);
}
}
);
}
}
ServerApplet.java
codice:
import javax.swing.JApplet;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class ServerApplet extends JApplet
{
private JButton button;
public void init()
{
button = new JButton ("Start Server");
button.addActionListener
(
new ActionListener()
{
public void actionPerformed (ActionEvent event)
{
Server server = new Server();
server.runServer();
}
}
);
add (button);
}
}