Salve, ho un problema di comunicazione stra client e server. E' il gioco del lotto, si chiedono ruota, numeri da giocare e cosa giocare tra ambo, terno ecc ecc. Riescono a connettersi ma alla fine, dopo aver inserito tutto, compare il messaggio di errore java.io.eofexception
Non leggo la risposta dal server. Come mai?
Lato Client
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class LottoClient
{
ObjectInputStream Sinput; // legge il socket
ObjectOutputStream Soutput; // scrive il socket
Socket socket;
String ruota; //dichiaro le variabili
String giocata;
int dimensione_array;
//int[] numeri_da_giocare;
String[] dati;
LottoClient(int port)
{
try
{
socket = new Socket("localhost", port);
}
catch(Exception e)
{
System.out.println("Errore di connessione con il server:" + e);
return;
}
System.out.println("Connessione accettata " +
socket.getInetAddress() + ":" +
socket.getPort());
try
{
Sinput = new ObjectInputStream(socket.getInputStream());
Soutput = new ObjectOutputStream(socket.getOutputStream());
}
catch (IOException e)
{
System.out.println("Exception crea nuovo flusso Input/output: " + e);
return;
}
//ho la connessione e chiedo all'utente cosa vuole giocare
giocata = JOptionPane.showInputDialog ( "Scegli cosa giocare tra ambo, terno, quaterna, cinquina:" );
switch (giocata)
{
case "ambo":
dimensione_array = 3;
dati = new String[dimensione_array];
break;
case "terno":
dimensione_array = 4;
dati = new String[dimensione_array];
break;
case "quaterna":
dimensione_array = 5;
dati = new String[dimensione_array];
break;
case "cinquina":
dimensione_array = 6;
dati = new String[dimensione_array];
break;
default:
break;
}
//chiedo all'utente su quale ruota vuole giocare
ruota = JOptionPane.showInputDialog ( "Su quale ruota vuoi effettuare la giocata?" );
dati[0] = ruota;
for (int i = 1; i < dimensione_array; i++)
{
dati[i] = JOptionPane.showInputDialog ( "Inserisci il numero da giocare:" );
}
//invia la stringa al server
try
{
Soutput.writeObject(dati);
Soutput.flush();
}
catch(IOException e)
{
System.out.println("Errore di scrittura nel socket: " + e);
return;
}
//legge la stringa dal server
String risultato;
try
{
risultato = (String) Sinput.readObject();
System.out.println("Esito estrazione: " + risultato);
}
catch(Exception e)
{
System.out.println("Problema lettura risposta dal server: " + e);
}
try
{
Sinput.close();
Soutput.close();
}
catch(Exception e) {}
}
//avvia il server sulla porta specificata
public static void main(String[] arg)
{
new LottoClient(2600);
}
}
Lato Server
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collections;
public class LottoServer
{
private ServerSocket serverSocket;
LottoServer(int port)
{
//crea il socket server ed attende che venga richiesta una connessione
try
{
serverSocket = new ServerSocket(port);
System.out.println("Server in attesa..." + serverSocket.getLocalPort());
while (true)
{
Socket socket = serverSocket.accept(); //accetta la connessione
System.out.println("Un nuovo client ha chiesto la connessione");
TcpThread t = new TcpThread(socket); //crea un thread
System.out.println("Inizia un thread per un nuovo client");
t.start();
}
}
catch (IOException ex)
{
System.out.println("Exception per il ServerSocket " + ex);
}
}
public static void main(String[] arg)
{
new LottoServer(2600);
}
class TcpThread extends Thread
{
Socket socket;
ObjectInputStream Sinput;
ObjectOutputStream Soutput;
TcpThread(Socket socket)
{
this.socket = socket;
}
public void run()
{
System.out.println("Thread prova a creare un object Input/Output");
try
{
Soutput = new ObjectOutputStream(socket.getOutputStream());
Soutput.flush();
Sinput = new ObjectInputStream(socket.getInputStream());
}
catch (IOException e)
{
System.out.println("Exception" + e);
return;
}
System.out.println("Thread attende una stringa dal client");
//il server riceve la stringa per la ruota e l'array di interi
try
{
//dati presi dal client
String[] dati = (String[])Sinput.readObject();
int dimensione_array = dati.length;
String ruota_da_giocare = dati[0];
int[] numeri_da_giocare = new int[dimensione_array];
for (int i = 1; i < dimensione_array; i++)
{
numeri_da_giocare[i] = Integer.parseInt(dati[i]);
}
//genera le ruote del lotto con i relativi numeri estratti
String ruote[] = new String[11];
ruote[0] ="Bari";
ruote[1] ="Cagliari";
ruote[2] ="Firenze";
ruote[3] ="Genova";
ruote[4] ="Milano";
ruote[5] ="Napoli";
ruote[6] ="Palermo";
ruote[7] ="Roma";
ruote[8] ="Torino";
ruote[9] ="Venezia";
ruote[10] ="Nazionale";
for (String s: ruote)
{
//Dichiaro l'array di interi da 90 numeri
ArrayList<Integer> numbers = new ArrayList<Integer>();
for(int i = 0; i < 90; i++)
{
//aggiungo i 90 numeri all'array in ordine crescente
numbers.add(i+1);
}
//mischio i numeri in ordine casuale
Collections.shuffle(numbers);
//eseguo il confronto
if(s.equals(ruota_da_giocare))
{
//confronto per vedere se ho vinto
int[] numeri_della_ruota = new int[5];
for(int j=0; j<5; j++)
{
numeri_della_ruota[j] = numbers.get(j);
}
}
}
}
catch (IOException e)
{
System .out.println("Exception lettura/ scrittura: " + e);
return;
}
catch (ClassNotFoundException o)
{ }
finally
{
try
{
Soutput.close();
Sinput.close();
}
catch (Exception e)
{
}
}
}
}
}