Ciao a tutti sono nuovo del forum e spero che qualcuno mi possa aiutare perchè sto rendendo complicatissima una cosa che dovrebbe essere fatta con una certa faciltà, cioè unasemplice chat in java con client e server multithread;
Premetto che ho già dato un'occhiata alle varie versioni trovate su questo sito e sul forum, ma vorrei evitare di copiarle, perchè dato che all'esame devo anche spiegare come l' ho fatta vorrei cercare di capire quello che scrivo, quindi spero in qualcuno che mi spieghi i vari passi se non riesco a farli da me; per il momento posto un errore di cui non riesco a capire la causa, forse perchè non ho ancora molta familiarità con il linguaggio java:
codice:
----------SERVER-------------
import java.io.*;
import java.net.*;
import java.util.*;
public class ChatServer {
private static final int serverPort = 7890;
public static Vector n_utenti = new Vector();
public int n;
public Connessione s;
public ChatServer() {
}
public static void main(String args[]) {
try {
ServerSocket server = new ServerSocket(serverPort);
System.out.println("Server Attivo");
while (true) {
Socket clientSocket = server.accept();
Connessione c = new Connessione(clientSocket /*, u*/);
n_utenti.add(c);
System.out.println(n_utenti.size());
}
} catch (IOException e) {
System.out.println("Listen:" + e.getMessage());
}
}
}
class Connessione extends Thread {
BufferedReader in;
PrintWriter out;
Socket clientSocket;
DataOutputStream o;
boolean connesso = true;
public Connessione(Socket aClientSocket /*, Utente u*/) {
try {
this.clientSocket = aClientSocket;
System.out.println("connessione ricevuta da: " +
clientSocket.getInetAddress());
in = new BufferedReader(new InputStreamReader(clientSocket.
getInputStream()));
out = new PrintWriter(clientSocket.getOutputStream(), true);
this.start();
} catch (IOException e) {
System.out.println("Connessione:" + e.getMessage());
}
}
public void run() {
Socket address;
try { // an echo server
// echo client input
out.println("Hello! Enter BYE to Exit");
boolean done = false;
while (!done) {
String line = in.readLine();
if (line == null) {
done = true; //Loop infinito in cui scrivo qualcosa e me lo rispedisco, finch� nn scrivo "Bye"
}
else if (line.trim().equals("BYE")) {
done = true;
}
else {
for (int i = 0; i < ChatServer.n_utenti.size(); ) {
try {
address = (Socket) (ChatServer.n_utenti.get(i));
o = new DataOutputStream(new BufferedOutputStream(address.getOutputStream()));
o.writeUTF(line);
o.flush();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println(ChatServer.n_utenti.size());
out.println(line);
}
}
System.out.println("il Client " + clientSocket.getInetAddress() +
" si � disconnesso");
} catch (EOFException e) {
System.out.println("EOF:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO:" + e.getMessage());
} finally {
try {
clientSocket.close();
} catch (IOException e) {}
}
}
}
---------CLIENT-----------
import java.net.*;
import java.io.*;
public class ChatClient {
/** Creates a new instance of EchoClient */
public ChatClient() {
}
public static void main(String args[]) {
// arguments supply message and hostname of destination
Socket s = null;
try {
String SERVER = "localHost";
int serverPort = 7890;
s = new Socket(); //si crea una socket NN bloccante
s.connect(new InetSocketAddress(SERVER, serverPort), 1000); //Dopo 1000 ms esce, altrimenti nresterebbe bloccato
BufferedReader s_in = new BufferedReader (new InputStreamReader(s.getInputStream())); //verso server
PrintWriter s_out = new PrintWriter(s.getOutputStream(),true);
BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
String data = s_in.readLine();
System.out.println(data);
while (true) {
String input = console.readLine();
s_out.println("Echo: " +input);
data = s_in.readLine();
System.out.println(data);
if (input.trim().equals("BYE")) {
System.exit(0);
} }
} catch (UnknownHostException e) {
System.out.println("Sock:" + e.getMessage());
} catch (EOFException e) {
System.out.println("EOF:" + e.getMessage());
} catch (IOException e) {
System.out.println("IO:" + e.getMessage());
}
finally {
if (s != null) {
try {
s.close();
} catch (IOException e) { //Entra in gioco quando il socket viene chiuso per motivi esterni all'utente
System.out.println("close:" + e.getMessage());
}
}
}
}
private void jbInit() throws Exception {
}
}
Faccio paritre il server e il client e tutto ok, però quando sul client provo a scrivere qualcosa e premo invio, non succede niente (nel senso che non me lo scrive su tutti i client connessi) e sul server esce a ciclo infinito questo errore:
at progetto.Connessione.run(Connessione.java:59)
java.lang.ClassCastException
at progetto.Connessione.run(Connessione.java:59)
java.lang.ClassCastException
at progetto.Connessione.run(Connessione.java:59)...
In particolare si rferisce a questa parte di codice:
codice:
for (int i = 0; i < ChatServer.n_utenti.size(); ) {
try {
address = (Socket) (ChatServer.n_utenti.get(i));
o = new DataOutputStream(new BufferedOutputStream(address.getOutputStream()));
o.writeUTF(line);
o.flush();
Io vorrei fare in modo che qualsisasi cosa scrivo su un client venga trasmesso anche agli altri, se qualcuno può indicarmi un modo oltre a questo...grazie a tutti ciao ciao