Problema com Threads [RESOLVIDO]

0 respostas
von.juliano
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
Criado 15 de março de 2007
Respostas 0
Participantes 1