Connessione socket tra due reti LAN

di il
2 risposte

Connessione socket tra due reti LAN

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

2 Risposte

  • Re: Connessione socket tra due reti LAN

    g.lombardo4 ha scritto:


    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.
    Quando si tratta di esporre un server su una rete LAN, su reti differenti o su internet, la questione importante è agire sui dispositivi hardware/software per "aprire" la porta di networking in modo che l'accesso sia possibile dall'esterno. Non c'entra più nulla la programmazione (a parte saper specificare poi l'indirizzo corretto di connessione) ma si tratta solo di pura "amministrazione delle reti", cioè avere il pieno controllo di tutti i firewall sw/hw, router, ecc... che ci sono in mezzo per configurarli appropriatamente.

    E su questo non saprei di certo aiutarti perché non so che prodotti sw/hw hai a disposizione.

    P.S. il readLine() di DataInputStream è deprecato, NON andrebbe usato. In altre parole, hai usato metodi inappropriati per inviare e ricevere i dati.
  • Re: Connessione socket tra due reti LAN

    In effetti hai ragione, non è un problema che riguarda la programmazione java in sè.
    Provo a chiedere nella sezione hardware e reti, fornendo dettagli di ciò che utilizzo come hw/sw.
    Grazie comunque, almeno so che non è un problema che riguarda codice
Devi accedere o registrarti per scrivere nel forum
2 risposte