Server.

import java.awt.Graphics2D;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

/**
 *
 * @author
 */

public class frmTombola extends javax.swing.JFrame {
    /**
     * Creates new form frmTombola
     */
   
    private int Urna[] = new int[90];
    private int estratto, nrDentro;
    private int punteggi[] = new int[18];
    private int prosVinc;
    final int DIM = 30;
    
    private final int TOTCART = 24;
    private String[] cartelle = new String[TOTCART];
    private int nrCon, nrUt;
    private final int NRCON=3;
    private Socket[] socket;
    private int[][] puntiUt;
    
    private PrintWriter[] out;
    
    public frmTombola() {
        initComponents();
    }

    private void creaCartelle() {
        int i, indice, tmp;
        for (i=0; i<TOTCART; i++) Urna[i] = i;
        Random caso = new Random();
        for (i=TOTCART-1; i>1; i--) {
            indice = caso.nextInt(i);
            tmp = Urna[indice];
            Urna[indice] = Urna[i];
            Urna[i] = tmp;
        }
    cartelle[Urna[0]] = ".6..2330..51..78....17..3941..60..85..1925..4358....89";
    cartelle[Urna[1]] = ".2..20..42..6874...3..29..4453..76....15..34..5569..80";
    cartelle[Urna[2]] = ".5..22..48..63..81..12..36..54..7586.8..24....5664..90";
    cartelle[Urna[3]] = ".7..21..45..6172...913..32..57..73....18..3547..65..88";
    cartelle[Urna[4]] = "..11..3746....7082.4..2638..59..77....1428..49..66..87";
    cartelle[Urna[5]] = "..10..31..50..7183.1..27..40..6279....16..33..5267..84";
    cartelle[Urna[6]] = "..1323..4055..70...7..2534..59..73....15..3646..64..87";
    cartelle[Urna[7]] = "..11..31..5062..82.1..28..4254..78....18..3345..6579..";
    cartelle[Urna[8]] = "..19..32..5160..86.4..24..47..6372...6..26..49..697288";
    cartelle[Urna[9]] = "..10..35..56..7680.8..21..44..66..81..14..38..5867..83";
    cartelle[Urna[10]] = "..1220..43..61..85.216..37..53..74...9..29..48....7790";
    cartelle[Urna[11]] = "..17..30..5268..84.3..22..41....7189.5..2739..57..75..";
    cartelle[Urna[12]] = "..10..3543..63..82.316..38..51..73....1724..4556..79..";
    cartelle[Urna[13]] = ".5..2630..53..74...7..28..48..68..84..14..34..55..7589";
    cartelle[Urna[14]] = "..11..31..57..7186.2..20..46..6272...6....32..5869..88";
    cartelle[Urna[15]] = ".4..22..4054..77...9..25..42..60..80..12..39..5967..83";
    cartelle[Urna[16]] = "..1523..41..61..81.8..2736..52..76....18..3747..66..90";
    cartelle[Urna[17]] = "..1321..44..6470....19..33..50..7885.1..29..49..65..87";
    cartelle[Urna[18]] = ".1..20..4655..72....10..3149..60..82..182737..50....90";
    cartelle[Urna[19]] = ".2..22..40..61..83..12..33..54..7189.4..25..45..6678..";
    cartelle[Urna[20]] = ".5..2332..53..73....1329..42..63..87.917..38..57..76..";
    cartelle[Urna[21]] = "..16....445265..80.6..28....58..7484..19..3547..69..86";
    cartelle[Urna[22]] = ".8..26..43..64..81..14..34..51..7085..15..3948..6779..";
    cartelle[Urna[23]] = ".3..2136..56....88.7..24..41..6275....11..30..506877..";
    }

    private void disegna(){
      Graphics2D g = (Graphics2D)jPanel1.getGraphics();
      int x, y, i=0;
      for(y=60, i=1; y<9*DIM+60; y+=DIM)
        for (x=10; x<(10*DIM+10); x+=DIM, i++) {
          g.drawString(""+i, x, y);
        }
      estratto = 0;
      nrDentro=90;
      for (i=0; i<18; i++) punteggi[i]=0;
      prosVinc=0;
      jButton1.setEnabled(true);
      g.drawLine(5, 40, 10*DIM+5, 40);
      g.drawLine(5, 40+3*DIM, 10*DIM+5, 40+3*DIM);
      g.drawLine(5, 40+6*DIM, 10*DIM+5, 40+6*DIM);
      g.drawLine(5, 40+9*DIM, 10*DIM+5, 40+9*DIM);
      g.drawLine(5, 40, 5, 40+9*DIM);
      g.drawLine(5*DIM, 40, 5*DIM, 40+9*DIM);
      g.drawLine(10*DIM+5, 40, 10*DIM+5, 40+9*DIM);
      creaCartelle();
      try {
          ascolta();
      } catch(IOException e) {}
    }
    
    private int estrai() {
      int n = Urna[estratto++];
      String num;
      if (n<=9) num="."+n;
      else num=""+n;
      for (int i=0; i<nrUt; i++) {
          out[i].println(num);
      }
      return n;
    }
    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        // TODO add your handling code here:
        disegna();
        int i, indice, tmp;
        for (i=0; i<90; i++) Urna[i] = i+1;
        Random caso = new Random();
        for (i=89; i>1; i--) {
            indice = caso.nextInt(i);
            tmp = Urna[indice];
            Urna[indice] = Urna[i];
            Urna[i] = tmp;
        }
    }                                          

    private void VincitaUt(int n){
      String num, tmp;
        if (n<=9) num ="."+n;
        else num=""+n;
      for (int utente=0; utente<nrUt; utente++) {
          for (int j=0; j<54; j+=2) {
            tmp = cartelle[utente].substring(j, j+2);
            if (num.equals(tmp)){
                int riga = j/18;
                ++puntiUt[utente][riga];
                if(puntiUt[utente][riga]==2 && prosVinc==0){
                  jTextArea1.append("\nUtente "+utente+" ha fatto Ambo ");
                  prosVinc++;
                  break;
                }
                if(puntiUt[utente][riga]==3 && prosVinc==1){
                  jTextArea1.append("\nUtente "+utente+" ha fatto Terno ");
                  prosVinc++;
                  break;
                }
                if(puntiUt[utente][riga]==4 && prosVinc==2){
                  jTextArea1.append("\nUtente "+utente+" ha fatto Quaterna ");
                  prosVinc++;
                  break;
                }
                if(puntiUt[utente][riga]==5 && prosVinc==3){
                  jTextArea1.append("\nUtente "+utente+" ha fatto Cinquina ");
                  prosVinc++;
                  break;
                }
                if (prosVinc==4){
                  if(puntiUt[utente][0]+puntiUt[utente][1]+puntiUt[utente][2]==15)
                      jTextArea1.append("\nUtente "+utente+" ha fatto Tombola ");
                }
            }
         }
      }
    }
    
    private void Vincita(int n){
        // controllo del punteggio.
        int riga = (n-1)/5;
        ++punteggi[riga]; // conta i numeri sulla riga.
        
        if (punteggi[riga]==2 && prosVinc==0) {
          jTextArea1.append("\nAmbo");
          prosVinc++;
        }
        if (punteggi[riga]==3 && prosVinc==1) {
          jTextArea1.append("\nTerno");
          prosVinc++;
        }
        if (punteggi[riga]==4 && prosVinc==2) {
          jTextArea1.append("\nQuaterna");
          prosVinc++;
        }
        if (punteggi[riga]==5 && prosVinc==3) {
          jTextArea1.append("\nCinquina");
          prosVinc++;
        }
        // per verificare la tombola si considera che
    // in ogni sottocartella ci devono stare 15 numeri.
        if (prosVinc==4) {
          for(int i=0; i<18; i+=3)
            if ((punteggi[i]+punteggi[i+1]+punteggi[i+2])==15) {
              jTextArea1.append("\nTombola");
            // fermare il gioco e proporre nuova partita
          }
        }
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
        if (nrDentro==0) return;
        nrDentro--;
        Graphics2D g = (Graphics2D)jPanel1.getGraphics();
        int n = estrai(), x, y;
        y = (int) (n-1)/10*DIM+45;
        x = ((n-1)%10)*DIM + 8;
        jTextArea1.append("\n"+(90-nrDentro)+": "+n);

        g.drawOval(x, y, DIM/2, DIM/2);
        //Vincita(n); 
        VincitaUt(n);
    }                                        

public void ascolta() throws IOException {
    nrCon=NRCON-1; // max 3 connessioni
    nrUt = 0;
    socket = new Socket[NRCON];
    puntiUt = new int[NRCON][3];
    
    out = new PrintWriter[NRCON];
    
    //out = new PrintWriter[NRCON];
    ServerSocket server = new ServerSocket(9090);
    while(nrCon>=0) {
      if (nrUt==24) return;
      try {
        socket[nrCon] = server.accept();
        for (int i=0; i<3; i++) puntiUt[nrUt][i]=0;
        try {
           out[nrUt] = new PrintWriter(socket[nrCon].getOutputStream(), true);
           out[nrUt].println(cartelle[nrUt++]);
        } catch(IOException e) {  }
      } catch(IOException e) {  }
      nrCon--;
    }
    System.out.println("tutti gli utenti sono connessi");
}

Client

import java.awt.Graphics2D;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

/**
 *
 * @author
 */
public class frmTombolaClient extends javax.swing.JFrame {

    

private BufferedReader in;
private PrintWriter out;
private String Cartella[] = new String[27];
private int posX[], posY[];

    /**
     * Creates new form frmTombolaClient
     */
    public frmTombolaClient() {
        initComponents();
    }

public void aspetta() throws IOException {
    Graphics2D g = (Graphics2D) jPanel1.getGraphics();
  String Num = in.readLine();
  while (Num!=null) {
    for (int i=0; i<27; i++){
      if (Num.equals(Cartella[i])) {
        g.drawOval(posX[i]-5, posY[i]-15, 20, 20);
        break;
      }
    }
    jTextArea1.append("\nEstratto: " + Num);
    Num = in.readLine(); 
  }
}    

public void connetti() throws IOException {
  // Crea la connessione e inizia la trasmissione.
    posX=new int[27];
    posY=new int[27];
  Socket socket = new Socket("127.0.0.1", 9090);
  in = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
  out = new PrintWriter(socket.getOutputStream(), true);
  String Cart = in.readLine();
  String Num;
  jTextArea1.append(Cart + "\n");
  Graphics2D g = (Graphics2D) jPanel1.getGraphics();
  for (int i=0; i<18; i+=2) {
    Num = Cart.substring(i,i+2);
    posX[i/2] = i*20+20;
    posY[i/2] = 40;
    g.drawString(Num, posX[i/2], posY[i/2]);
    Cartella[i/2]=Num;
  }
  for (int i=18; i<36; i+=2) {
    Num = Cart.substring(i,i+2);
    posX[i/2] = (i-18)*20+20;
    posY[i/2] = 80;
    g.drawString(Num, posX[i/2], posY[i/2]);
    Cartella[i/2]=Num;
  }
  for (int i=36; i<54; i+=2) {
    Num = Cart.substring(i,i+2);
    posX[i/2] = (i-36)*20+20;
    posY[i/2] = 120;
    g.drawString(Num, posX[i/2], posY[i/2]);
    Cartella[i/2]=Num;
  }
  g.drawLine(10, 25, 370, 25);
  g.drawLine(10, 55, 370, 55);
  g.drawLine(10, 95, 370, 95);
  g.drawLine(10, 135, 370, 135);
  for (int i=0; i<20; i+=2)
    g.drawLine(i*20+10, 25, i*20+10, 135);
  //aspetta();
}

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:
         try {
          connetti();
         } catch(IOException e) {  }
         try {
             aspetta();
         } catch (IOException e) {}
    }