 
View Full Version : [JAVA]classe ServerSocket
Frank1962
14-02-2004, 19: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:
hai già trovato la soluzione, devi utilizzare i thread
probabilmente lo hai fatto nel modo sbagliato
Frank1962
14-02-2004, 20: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!
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, 21: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:
Che io sappia, non si può.
Frank1962
14-02-2004, 21: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!
C'è qualcosa che mi sfugge.
Vuoi mandare un bit o vuoi mandare un boolean?
Frank1962
15-02-2004, 00: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 ;)
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).
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.