Pessoal,
Não sei Java e tive que fazer um trabalho para a disciplina de redes.
Trata-se de um chat utilizando sockets, onde um cliente manda uma mensagem e o servidor distribui para todos os outros usuários. Mas só a primeira mensagem vai e volta, as subsequentes não são enviadas para os demais usuários.
Alguém pode me ajudar?
import java.io.*;
import java.net.*;
import java.util.*;
import java.text.*;
import sun.misc.Queue;
public class TCPServer extends Thread {
private static Queue filaClientes;
private Socket connection;
public static void main(String argv[]) throws Exception {
filaClientes = new Queue();
// cria socket de comunicação com os clientes na porta 6789
ServerSocket welcomeSocket = new ServerSocket(6789);
// espera msg de algum cliente e trata
while (true) {
// espera conexão de algum cliente
Socket connectionSocket = welcomeSocket.accept();
Thread thread = new TCPServer(connectionSocket);
thread.start();
}
}
public TCPServer(Socket socket)
{
connection = socket;
}
public void run()
{
try
{
// cria streams de entrada e saida com o cliente que chegou
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connection.getInputStream()));
PrintStream outToClient = new PrintStream(connection.getOutputStream());
filaClientes.enqueue(outToClient);
String linha = inFromClient.readLine();
String texto = linha.substring(linha.indexOf("#")+1);
//Lê as mensagens do cliente recém conectado em loop e envia para todos os usuários
while (texto != null && !texto.equals(""))
{
try
{
Queue filaEnvio = filaClientes;
while(!filaEnvio.isEmpty())
{
PrintStream out = (PrintStream) filaEnvio.dequeue();
//Não envia para o usuário atual
if (out != outToClient)
{
out.println("Mensagem: " + texto);
//Capturo a hora de envio para exibir a diferença
long currentTime = System.currentTimeMillis();
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
long previousTime = Long.parseLong(linha.substring(0,linha.indexOf("#")));
long elapsed = currentTime-previousTime;
out.println("Tempo: " + dateFormat.format(new Date(elapsed)));
}
}
}
catch (InterruptedException exception)
{
}
}
}
catch(IOException exception)
{
}
}
}
import java.io.*; // classes para input e output streams
import java.net.*; // classes para socket, serversocket e clientsocket
public class TCPClient extends Thread {
private static Boolean finalizar = false;
private Socket connection;
public static void main(String argv[]) throws Exception {
try {
// cria o socket de acesso ao server hostname na porta 6789
Socket clientSocket = new Socket("127.0.0.1", 6789);
PrintStream out = new PrintStream(clientSocket.getOutputStream());
Thread thread = new TCPClient(clientSocket);
thread.start();
BufferedReader inFromServer =
new BufferedReader(new InputStreamReader(
System.in));
String sentence;
while (true) {
sentence = inFromServer.readLine();
if (finalizar) {
return;
}
long startTime = System.currentTimeMillis();
out.println(startTime + "#" + sentence);
}
} catch (IOException exception) {
}
finalizar = true;
}
public TCPClient(Socket socket)
{
connection = socket;
}
public void run()
{
try
{
BufferedReader inFromServer =
new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String texto;
while (true)
{
texto = inFromServer.readLine();
if (texto == null)
{
System.out.println("Conexão finalizada");
break;
}
else
{
System.out.println("\n" + texto + "\n");
}
}
}
catch (IOException exception)
{
}
finalizar = true;
}
}
Desculpa passar um código desse tamanho, mas não estou encontrando o erro. Se conseguir aqui aviso vocês.
Valeu!
