PDA

View Full Version : [JAVA]classe ServerSocket


Frank1962
14-02-2004, 18:51
come faccio, utilizzando la classe ServerSocket, ad "ascoltare" su + porte senza dover avviare + volte il singolo programma ?

...ho provato utilizzando i thread e non ma il metodo server.accept(); che serve ad accettare le connessioni in ingresso mi blocca il ciclo for per la creazione dei thread al primo e si mette subito in attesa! :( :muro:

recoil
14-02-2004, 19:44
hai già trovato la soluzione, devi utilizzare i thread
probabilmente lo hai fatto nel modo sbagliato

Frank1962
14-02-2004, 19:59
Originariamente inviato da recoil
hai già trovato la soluzione, devi utilizzare i thread
probabilmente lo hai fatto nel modo sbagliato
....può essere, i thread non li ho mai digeriti molto bene... cmq:

package servlet;


public class mainClass {

static Thread[] tcpServer = new Server[3];

public static void main(String[] args) throws Exception {

for(int i=28000; i<28003;i++) {
tcpServer[i-28000] = new Server(i);
tcpServer[i-28000].start();
System.out.println(i); // <-- ciclo bloccato, infatti il println non viene eseguito
}

}
}


package servlet;

import java.net.*;
import java.io.*;


public class Server extends Thread {

int port;

public Server(int port) {
System.out.println(port);
this.port = port;
setDaemon(true);

try {
ServerSocket server = new ServerSocket(port);
// la accept e' bloccante fino all'arrivo di una connessione
Socket s = server.accept();

System.out.println("... accepted:"+s);
InputStream i=s.getInputStream();
OutputStream o=s.getOutputStream();
System.out.println(port);

while(true) {
int c = i.read();
System.out.print((char)c);
o.write(c);
}
} catch(Exception e) { e.printStackTrace(); System.out.println(e); }

}


}

...se provi ad avviare vedrai che viene creato soltanto un ServerSocket e poi si blocca in attesa, se provi poi a togliere tutto quello che riguarda il "Socket s = server.accept();" vedrai che il ciclo viene eseguito completamente!

PGI
14-02-2004, 20:30
package servlet;

import java.net.*;
import java.io.*;


public class Server extends Thread {

int port;

public Server(int port) {
System.out.println(port);
this.port = port;
setDaemon(true);
}

public void run() {
try {
ServerSocket server = new ServerSocket(port);
// la accept e' bloccante fino all'arrivo di una connessione
Socket s = server.accept();

System.out.println("... accepted:"+s);
InputStream i=s.getInputStream();
OutputStream o=s.getOutputStream();
System.out.println(port);

while(true) {
int c = i.read();
System.out.print((char)c);
o.write(c);
}
} catch(Exception e) {
e.printStackTrace(); System.out.println(e);
}
}
}


Il metodo "start()" chiama per definizione "run". Così dovrebbe andare.

Frank1962
14-02-2004, 20:35
Originariamente inviato da PGI
Il metodo "start()" chiama per definizione "run". Così dovrebbe andare.
thankS! :D

ps: ....sai mica se è possibile mandare singoli Bit con i socket del java? :confused:

PGI
14-02-2004, 20:43
Che io sappia, non si può.

Frank1962
14-02-2004, 20:46
Originariamente inviato da PGI
Che io sappia, non si può.
:sfig: .....strano però, sarebbe utile poter usare i valori booleani: sopratutto quando si parla di applicazioni enterprise!

PGI
14-02-2004, 22:33
C'è qualcosa che mi sfugge.

Vuoi mandare un bit o vuoi mandare un boolean?

Frank1962
14-02-2004, 23:42
Originariamente inviato da PGI
C'è qualcosa che mi sfugge.

Vuoi mandare un bit o vuoi mandare un boolean?
be in teoria sarebbe uguale ........cmq un boolean ;)

ps: però mi piacerebbe sapere "come" viene mandato .....se come bit o come byte ;)

PGI
15-02-2004, 02:01
La rappresentazione interna di un boolean in Java è un intero (il tipo non è specificato).

La classe DataOutputStream permette di inviare boolean, che vengono "impacchettati" in byte (1 boolean = 1 byte).