vorrei tenere traccia dei socket aperti tramite una lista ed inviare a tutti i client , per ogni nuovo client che si connette , un messaggio che avvisa del nuovo utente in linea (messaggio di broadcast) .
Il codice per fare questo "esperimento" è il seguente.
codice:
import java.net.*;
import java.io.*;
import java.util.*;
public class Server {
private ServerSocket servSocket;
private int porta ;//num di porta su cui accetto connessioni
private boolean running; // mi dice finché devo servire il client
private ArrayList<Socket> clients;
Server(int port){//costruttore
this.porta=port;
this.running=false;
this.servSocket=null;
}
Server(){
}
//METODI
public void start(){//mette in ascolto il server
try {
servSocket=new ServerSocket(porta);//setto il socket
running=true;
System.out.println("In ascolto sulla porta "+porta);
} catch (IOException e) {
System.out.println("Impossibile connettersi alla porta "+porta);
}
while(running){
serve();
}
}
public void stop(){//fermo il servizio
running=false;
}
public void aggiorna(Socket link){
clients = new ArrayList<Socket>();
clients.add(link);// aggiungo il socket alla lista
int tot = clients.size();
PrintWriter OUT;
//invio broadcast
Socket cl;
Iterator<Socket> it = clients.listIterator();
while(it.hasNext()){
cl = it.next();
try {
OUT= new PrintWriter(cl.getOutputStream(),true);
OUT.println("Un nuovo client è connesso");
OUT.println(tot +"connessi");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void serve(){
try {
Socket canale=servSocket.accept();//accetto
Thread app = new Application(canale);
app.run();
} catch (IOException e) {
System.out.println("Impossibile connettersi al client");
stop();
}
}
public static void main(String[] args){
Server serv = new Server(7777);
serv.start();
}
}
public class Application extends Thread {
private Socket connessione;
private PrintWriter OUT ;
Application(Socket link){
this.connessione=link;
}
public void run(){
try {
Server serv = new Server();
serv.aggiorna(connessione);
System.out.println("connesso con il client");
OUT=new PrintWriter(connessione.getOutputStream(),true);
OUT.println("benvenuto");
} catch (IOException e) {
e.printStackTrace();
}
}
}
qualcuno paziente ed esperto potrebbe dirmi cosa c'è che non va ? La lista risulta sempre di dimensione 1
Ovviamente per la classe Application ho usato un altro file (Application.java)