Pessoal, essa é rápida: Tenho um "Servidor":
public class Servidor{
private static ServerSocket serverSocket;
public Servidor(ArrayList<String> lista) throws IOException {
serverSocket = new ServerSocket(5555);
System.out.println("Servidor funcionando...\n");
while (true) {
Cliente cliente = new Cliente(serverSocket, lista);
cliente.start();
}
}
}
class Cliente extends Thread {
private ObjectOutputStream toClient;
private ObjectInputStream fromClient;
private Socket socket;
private ArrayList<String> palavras;
public Cliente(ServerSocket serverSocket, ArrayList<String> lista) {
try {
socket = serverSocket.accept();
toClient = new ObjectOutputStream(socket.getOutputStream());
toClient.flush();
fromClient = new ObjectInputStream(socket.getInputStream());
palavras = lista;
} catch (Exception e1) {
e1.printStackTrace();
}
}
public void run() {
String texto = "\nUm aplicativo cliente em " + socket.getInetAddress()
+ " - " + socket.getInetAddress().getHostName()
+ " tenta se comunicar\n";
/* mensagem para a tela do servidor */
System.out.println(texto + "\nEspera envio de dados...\n");
try {
for (String palavra : palavras) {
boolean ok = false;
String escondida = esconde(palavra);
escondida = mostra(palavra, escondida, palavra.substring(0, 1));
String tentativa;
while (!ok) {
toClient.writeObject(escondida);
tentativa = (String) fromClient.readObject();
if(escondida.contains(tentativa))
toClient.writeObject("Letra já digitada!\n" + escondida);
else if(!palavra.contains(tentativa))
toClient.writeObject("Letra não encontrada!\n" + escondida);
else{
escondida = mostra(palavra, escondida, tentativa);
toClient.writeObject(escondida);
}
if(palavra.equals(escondida))
ok = true;
}
}
System.out.println("Cliente desconectado, acabaram as palavras.");
} catch (Exception e2) {
e2.printStackTrace();
}
}
E um client:
public class ClienteAdivinhar {
// objetos para a comunicação e manipulação de fluxos de dados:
private static Socket clientSocket;
private static ObjectOutputStream outToServer;
private static ObjectInputStream inFromServer;
public ClienteAdivinhar() {
}
public static void main(String argv[]) {
System.out.println("Iniciando o cliente...");
try {
clientSocket = new Socket("localhost", 5555);
outToServer = new ObjectOutputStream(clientSocket.getOutputStream());
inFromServer = new ObjectInputStream(clientSocket.getInputStream());
while (true) {
/* recebe texto do servidor */
String textoServidor = (String) inFromServer.readObject();
if (textoServidor.indexOf("Até logo!") != -1) {
JOptionPane.showMessageDialog(null, textoServidor);
break;
}
String letra = JOptionPane.showInputDialog(null, textoServidor
+ "\nDigite a letra desejada: ");
outToServer.writeObject(letra);
}
clientSocket.close();
outToServer.close();
inFromServer.close();
} catch (Exception exx) {
JOptionPane.showMessageDialog(null,
"Problemas na comunicação com o servidor. Veja se o aplicativo servidor ja esta funcionando, porta, etc..",
"Erro na comunicação.",
JOptionPane.INFORMATION_MESSAGE);
}
System.exit(0);
}
}
O problema é: Já que uma classe estende Thread e a outra não, elas meio que "perdem a sincronia", quando o Cliente manda um valor, ele não espera a resposta do servidor, aí exibe os dados atrasados. Alguém pode me ajudar? Obrigado! :P