PDA

View Full Version : [Java]Non riesco a far parlare i due pc tramite socket


m3kka
07-03-2009, 09:59
Intanto posto il codice ^^


server = new ServerSocket(7777);
Socket s1 = server.accept();

cport = 8000 + (int)(Math.random() * 100);

new ServerDinamico(cport);
cPorta = new PrintStream(s1.getOutputStream());
cPorta.println(cport);

cPorta.close();
s1.close();


Questo primo spezzone di codice in sostanza dovrebbe ricevere una richiesta, generare un numero casuale compreso da 8000 e 8100, inizializzare un server utilizzando il numero casuale come porta (attraverso la classe ServerDinamico) e poi comunicare la nuova porta a cui connettersi al client che ha fatto la prima richiesta.


public ConnessionePreliminare(InetAddress ip) throws IOException
{
Socket s1 = new Socket(ip, 7777);
BufferedReader porta = new BufferedReader(new InputStreamReader(s1.getInputStream()));

s2 = new Socket(ip, Integer.parseInt(porta.readLine()));
porta.close();
s1.close();
}


Questa è la classe utilizzata per connettersi al server di cui sopra.

Per qualche motivo a me ignoto tutto funziona meno la comunicazione della porta tra server e client, quindi:

- Viene ricevuta la richiesta dal server
- Il server ne crea un secondo sulla porta randomizzata (che si mette in listening)
- Il server non riesce ad inviare il numero di porta a cui connettersi

Spero di essermi spiegato ^^'' è un pelo contorta come cosa ^^

Ringrazio fin d'ora per qualsiasi aiuto, 'sta cosa mi sta facendo uscire di senno.

morskott
07-03-2009, 12:31
tra il cPorta.println(cport); e il cPorta.close(); prova cPorta.flush(); e il client prova con public ConnessionePreliminare(InetAddress ip) throws IOException
{
Socket s1 = new Socket(ip, 7777);
BufferedReader porta = new BufferedReader(new InputStreamReader(s1.getInputStream()));
Integer portaNuova=Integer.parseInt(porta.readLine());
System.out.println("la nuova porta risulta "+String.valueOf(portaNuova));
s2 = new Socket(ip, portaNuova);
porta.close();
s1.close();
} e vedi se ti stampa quel println

m3kka
07-03-2009, 13:07
Nulla da fare :_:

Posto il codice completo della classe ProcessoServer (prima avevo ommesso alcuni controlli sulla porta generata e il metodo per bloccare il server):


public class ProcessoServer extends Thread {
private int cport, i = 0;
public ServerSocket server;
private Component SezionePrincipale;
private PrintStream cPorta;
private int[] porteUsate = new int[100];
private ScegliPorta valuta;

@Override
public void run()
{
try {
while(true) {
server = new ServerSocket(7777);
Socket s1 = server.accept();
if(s1.getInetAddress().toString().equals("/127.0.0.1"))
{
server.close();
s1.close();
break;
}
else {
cport = 8000 + (int)(Math.random() * 100);

valuta = new ScegliPorta(cport, porteUsate);
while(valuta.Check() == false)
{
cport = 8000 + (int)(Math.random() * 100);
valuta = new ScegliPorta(cport, porteUsate);
}
porteUsate[i] = cport;
i++;

new ServerDinamico(cport);
cPorta = new PrintStream(s1.getOutputStream());

cPorta.println(cport);

cPorta.flush();

cPorta.close();
s1.close();
}
}
}
catch(IOException ex)
{
JOptionPane.showMessageDialog(SezionePrincipale, "Errore di connessione all'Interfaccia", "Amove", 0);
}
}
public void rimuoviPorta(int port)
{
for(int b = 0; b <= porteUsate.length; b++) {
if(port == porteUsate[b]) {
porteUsate[b] = -1;
}
}
}
public void bloccaServer() throws UnknownHostException, IOException {
Socket stop = new Socket("127.0.0.1", 7777);
}


Magari ci sono errori orribili nella classe che io non ho notato O.o

Questa inoltre è la classe ServerDinamico, che si preoccupa di generare il demone in ascolto sulla porta random.


public class ServerDinamico {
private Socket s;
public FinestraChat fin = new FinestraChat();

public ServerDinamico(int port) throws IOException
{
ServerSocket dserver = new ServerSocket(port);
s = dserver.accept();
fin.gestioneSocket(s);
fin.impostaNick("Anonimo");
dserver.close();
fin.setVisible(true);
}

}


Ecco adesso c'è proprio tutto ^^