Salve a tutti, ho realizzato questo piccolo codice :
Client:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import prog.io.ConsoleInputManager;
public class Client {
Socket mioSocket = null;
int porta = 6116; // porta server
DataInputStream in;
DataOutputStream out;
public void Comunica() {
try {
ConsoleInputManager tastiera= new ConsoleInputManager();
String messaggio = tastiera.readLine("Tu: "); //con metodo readLine legge ciò che digitiamo su tastiera
out.writeBytes(messaggio+"\n");
System.out.println("Aspetto messaggio da server...");
String ricevuta = in.readLine();
System.out.println("Server: " + ricevuta);
ricevuta= null;
} catch (IOException e) {
}
}
public Socket connetti() {
try {
System.out.println("Provo a connettermi al server...");
mioSocket = new Socket("IP_PUBBLICO_ROUTER_LAN_SERVER", porta); //connessione al socket --> il socket lo registriamo nella variabile server, necessario per la comunicazione
System.out.println("Connesso...");
in = new DataInputStream(mioSocket.getInputStream());
out= new DataOutputStream(mioSocket.getOutputStream());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
System.err.println("Impossibile stabilire connessione");
}
return mioSocket;
}
public static void main(String[] args) throws UnknownHostException {
Client client = new Client();
client.connetti();
while(true) {
client.Comunica();
}
}
}
Server:
import java.io.*;
import java.net.*;
import prog.io.ConsoleInputManager;
public class Server {
ServerSocket server=null;
Socket socketClient = null;
DataOutputStream out;
DataInputStream in;
ConsoleInputManager tastiera= new ConsoleInputManager();
int porta = 6116; //porta server
public void Comunica() {
try {
System.out.println("Aspetto un messaggio dal client");
String letto = in.readLine();
System.out.println("Client: "+letto);
letto=null;
String risposta = tastiera.readLine("Tu: ");
out.writeBytes(risposta+"\n");
} catch (IOException e) {
}
}
public Socket attendi() {
try {
System.out.println("Inizializzo il server...");
server= new ServerSocket(porta); //inizializziamo il servizio
System.out.println("Server pronto, in ascolto sulla porta: " + porta);
//mi metto in ascolto sulla porta che ho aperto
socketClient = server.accept(); //accettiamo connessione con client (quando avviene)
System.out.println("Connessione stabilita!");
server.close(); //(connessione punto-a-punto) una volta accettata connessione con un client, con questo metodo evitiamo connessioni multiple(che altri client possano connettersi anche)
in= new DataInputStream(socketClient.getInputStream()); //per farci dire dov'è che il client scrive.
out= new DataOutputStream(socketClient.getOutputStream()); //dove diremo le cose al client
}catch(IOException e) {
e.printStackTrace();
}
return socketClient;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Server s= new Server();
s.attendi();
while(true) {
s.Comunica();
}
}
}
costituito da due classi( Client e Server), ciascuna delle due posta su un computer differente.
Se i due computer sono connessi alla stessa rete Lan la comunicazione avviene senza problemi (in tal circostanza però, all'interno del metodo connetti() del Client passo al costruttore del Socket direttamente l'indirizzo privato del server) invece se sono connessi a reti differenti non riescono ad effettuare la connessione socket.
Vi posto di seguito anche la configurazione del router lato server, in modo che inoltri i pacchetti provenienti dal client al giusto pc server.
Credo di sbagliare proprio la configurazione del router.
Internal IP Internal Port External IP External Port Protocol Action
192.168.1.106 6116 All IP 6116 Both
p.s. in corrispondenza di internal ip ho messo l'ip privato del pc su cui parte il server