Salve. Allora, ho un programma Server e un programma Client che possono mettersi in comunicazione. Ho provato a collegarli in diversi modi
1) Sul computer locale (localhost)
2) Tra 2 computer
3) Inserendo il server su un hosting (www.lenostreidee.net)
I primi due modi riescono, ma l'ultimo invece no. Con altervista ho altri problemi e quindi non posso provare... quando tento di collegare il client dal mio computer al server che si trova sul mio hosting www.lenostreidee.net, viene lanciata una ConnectException e quindi la connessione non avviene. Perchè? Come potrei risolvere?
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)
{
Thread serverThread = new Thread
(
new Runnable()
{
public void run()
{
Server server = new Server();
server.runServer();
}
}
);
serverThread.start();
}
}
);
add (button);
}
}
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.net.SocketException;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowListener;
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;
private boolean closingFlag = false;
public Server()
{
super ("Server");
setSize (300, 150);
setLocationRelativeTo (null);
setDefaultCloseOperation (JFrame.DO_NOTHING_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);
addWindowListener
(
new WindowAdapter()
{
public void windowClosing (WindowEvent event)
{
closingFlag = true;
closeConnection();
dispose();
}
}
);
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 (SocketException exception){}
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
{
if (output != null)
output.close();
if (input != null)
input.close();
if (connection != null)
connection.close();
if (server != null && closingFlag)
server.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);
}
}
);
}
}
Client.java
codice:
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class Client extends JFrame
{
private JTextField enterField;
private JTextArea displayArea;
private ObjectOutputStream output;
private ObjectInputStream input;
private String message = "";
private String chatServer;
private Socket client;
public Client (String host)
{
super ("Client");
setSize (300, 150);
setLocationRelativeTo (null);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
chatServer = host;
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));
setVisible (true);
}
public void runClient()
{
try
{
connectToServer();
getStreams();
processConnection();
}
catch (EOFException exception)
{
displayMessage ("\nClient terminated connection");
}
catch (IOException exception)
{
exception.printStackTrace();
}
finally
{
closeConnection();
}
}
private void connectToServer() throws IOException
{
displayMessage ("Attempting connection\n");
client = new Socket (InetAddress.getByName (chatServer), 12345);
displayMessage ("Connected to: " + client.getInetAddress().getHostName());
}
private void getStreams() throws IOException
{
output = new ObjectOutputStream (client.getOutputStream());
output.flush();
input = new ObjectInputStream (client.getInputStream());
displayMessage ("\nGot I/O streams\n");
}
private void processConnection() throws IOException
{
setTextFieldEditable (true);
do
{
try
{
message = (String) input.readObject();
displayMessage ("\n" + message);
}
catch (ClassNotFoundException exception)
{
displayMessage ("\nUnknown object type received");
}
} while (!message.equals ("SERVER>>> TERMINATE"));
}
private void closeConnection()
{
displayMessage ("\nClosing connection");
setTextFieldEditable (false);
try
{
output.close();
input.close();
client.close();
}
catch (IOException exception)
{
exception.printStackTrace();
}
}
private void sendData (String message)
{
try
{
output.writeObject ("CLIENT>>> " + message);
output.flush();
displayMessage ("\nCLIENT>>> " + 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);
}
}
);
}
}
ClientTest.java
codice:
public class ClientTest
{
public static void main (String[] args)
{
Client application;
if (args.length == 0)
application = new Client ("127.0.0.1");
else
application = new Client (args[0]);
application.runClient();
}
}