Ok, allora posto il codice!
Classe "Server"
codice:
/* SERVER */
import java.net.*;
import java.io.*;
import javax.swing.JOptionPane;
public class Server implements Runnable
{
private int port;
private ServerSocket server;
private static Socket socket;
private static BufferedWriter bw;
private String MessageToSend;
private Thread sendmess;
private boolean isConnected = false;
private String code_key = "modestopanetti";
////////////////////////////////////////////////////////////// constructor
public Server (int p)
{
port = p;
if(!createServer()) //crea il server ed segnala eventuale errore
System.err.println("Errore durante la creazione del Server");
}
//////////////////////////////////////////////////////////// crea il server
public boolean createServer()
{
try
{
server = new ServerSocket(port); //inizializza la serversocket
}
catch (IOException ex) {
ex.printStackTrace();
return false;
}
System.out.println("Server creato con successo!");
return true;
}
///////////////////////////////////////////////////////////// avvia il server
public void runServer()
{
try
{
if (isConnected==false) //se non è connesso, attendi una connessione
{
System.out.println("Server in attesa di richieste…");
socket = server.accept(); //attende fino all'arrivo della richiesta di connessione dal client
System.out.println("connessione con un client");
Server_Main.SF.setConnectionStatus(1); //connessione stabilita
isConnected = true;
}
System.out.println(isConnected +"... il server è pronto per l'invio di un nuovo messaggio");
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
////////////////////////////////////////////////// crea il buffer di scrittura
public void createBuffer() {
OutputStream sout;
try {
sout = socket.getOutputStream();
bw = new BufferedWriter(new OutputStreamWriter(sout)); // crea il buffered reader
System.out.println(" BUFFER creato");
} catch (IOException e) {System.out.println(" BUFFER non creato" +socket.isClosed()); }
}
////////////////////////////////////////////////////////chiude la connessione
public void CloseConnection() {
try {
try {
bw.flush();
bw.close(); //chiudi il buffered reader
System.out.println(" BUFFER chiuso\n");
} catch(NullPointerException npe) {npe.printStackTrace();}
} catch (IOException e) {e.printStackTrace();}
runServer();
}
/////////////////////////////////////////////////////////// invia il messaggio
public void SendMessage() {
MessageToSend = Server_Main.SF.message_area.getText(); //il messaggi oda inviare è quello scritto nell'area di testo
////////// CRITTOGRAFIA DEL MESSAGGIO////
Coder coder = new Coder(MessageToSend, code_key);
MessageToSend = coder.Codifica();
Server_Main.SF.code_area.setText(MessageToSend);
/////////////////////////////////////////
sendmess = new Thread(this);
sendmess.start();
}
///////////////////////////////////////////////////////////////////////////////
public void run() {
createBuffer();
try {
bw.write(MessageToSend); // scrivi il messaggio sul buffer //
System.out.println("Il messaggio ["+MessageToSend+"] è stato inviato correttamente!\n");
} catch (IOException e) {
System.out.println(" > impossibile inviare il messaggio");
JOptionPane.showMessageDialog(null, "impossibile inviare il messaggio. Connessione scaduta.");
e.printStackTrace();
}
CloseConnection(); // Chiude lo stream di output
sendmess.stop();
}
}
Classe "Server_Main"
codice:
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Server_Main {
public static int port_number = 1984;
public static ServerFrame SF; //finestra del server
public static Server SER; //processo server
///////////////////////////////////////////////////////
/* restituisce l'ip locale dell'host */
public static String getIP() {
InetAddress addr;
String ip =" --- ";
try {
addr = InetAddress.getLocalHost();
ip = addr.getHostAddress();
} catch (UnknownHostException e) {
e.printStackTrace();
}
return ip;
}
///////////////////////////////////////////////////////
public static void main (String args[]) {
SF = new ServerFrame(); //istanzia l'oggetto finestra del server
SER = new Server(port_number); //crea il server, assegnando il processo sulla porta passata per parametro
SER.runServer(); //avvia il server
}
}
Classe "Client":
codice:
/*client*/
import java.net.*;
import java.io.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Client implements Runnable
{
private static int server_portnumber;
private static String server_ip;
private static Thread listen;
private static Socket socket;
private InputStream is;
BufferedReader buffer;
private String code_key = "modestopanetti";
public Client()
{
SetIpSocket(); //imposta i valori degli indirizzi di client e server ramite finestre di dialogo
try
{
System.out.println("Apertura connessione…");
/**
*/
/** stabilisce la connessione con il server e resta in attesa */
Client_Main.CF.setIPPort(server_ip, server_portnumber);
socket = new Socket (server_ip, server_portnumber);
Client_Main.CF.SetOnOff(1); //a questo punto la connessione col server è stata stabilita, quindi l'interruttore passa a ON
Client_Main.CF.Answer("In attesa di rosposta...");
/**************************************************************/
ListenTo();
}
catch (ConnectException connExc)
{
System.err.println("Errore nella connessione ");
Client_Main.CF.Answer("Errore nella connessione "); // scrive nell'area del messaggio
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
public static void SetIpSocket() {
server_ip = JOptionPane.showInputDialog(Client_Main.CF, "Specificare indirizzo IPv4 del server");
server_portnumber = Integer.parseInt(JOptionPane.showInputDialog(Client_Main.CF, "Specificare numero di porta del server"));
}
public void ListenTo () {
listen = new Thread(this);
listen.start();
}
public void run () {
String answ;
try {
is = socket.getInputStream();
buffer = new BufferedReader(new InputStreamReader(is));
} catch (IOException ioe) {
System.out.println("Client.error 1");
ioe.printStackTrace();
}
try {
answ = buffer.readLine();
System.out.println("Risposta del server: " + answ); // Legge l’input e lo visualizza sullo schermo
// DECODIFICA DEL MESSAGGIO ////////////////
Decoder decoder = new Decoder(answ, code_key);
answ = decoder.Decodifica();
////////////////////////////////////////////
Client_Main.CF.Answer(answ);
if (answ.equals("bye")) {
//buffer.close();
socket.close();
System.out.println("Chiusura connessione effettuata");
}
else {
System.out.println("Client in attesa di un nuovo messaggio");
}
} catch (IOException e) {
System.out.println("Client.error 2");
e.printStackTrace();
}
//////////////////////////////////////////////////////////////
}
}
Classe "ClientMain":
codice:
public class Client_Main {
public static ClientFrame CF;
public static void main (String args []) {
CF = new ClientFrame();
Client client = new Client();
}
}
Sia per il client che per il server esistono le classi Coder e Decoder, che semplicemente codificano e decodificano il messaggio in partenza e poi in arrivo (il progetto che sto realizzando consiste in una chat crittografata), e poi le classi ServeFrame e ClientFrame. Queste ultime due, tramite una JFrame, gestiscono l'inserimento del messaggio (per il server) e la ricezione (per il client). In ServerFrame c'è un JButton che se premuto chiama il metodo Sendmessage() della classe Server. Sono funzionanti, poiché il primo messaggio viene inviato bene! Per non fare un papiro di codice, non posto queste classi poiché sono di supporto, e personalmente non credo che il problema risieda lì. Nel caso però posso postare anche quelle.
Grazie dell'aiuto ragazzi