Olá pessoal,
Tenho um chat que está funcionando perfeitamente
No servidor consigo saber quando um cliente fecha o sitema mas a minha grande dúvida é:
Como saber quando cai a conexão do cliente ou energia ou ele desligou o pc sem fechar o programa, algo do tipo.
Segue os códigos.
Cliente
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import javax.swing.JOptionPane;
public class ClienteSocket extends Thread {
// parte que controla a recepção de mensagens do cliente
private Socket conexao;
// construtor que recebe o socket do cliente
public ClienteSocket(Socket socket) {
this.conexao = socket;
}
public static void main(String args[]) {
try {
//Instancia do atributo conexao do tipo Socket, conecta a IP do Servidor, Porta
Socket socket = new Socket("192.168.0.100", 5555);
//Instancia do atributo saida, obtem os objetos que permitem controlar o fluxo de comunicação
PrintStream saida = new PrintStream(socket.getOutputStream());
BufferedReader teclado = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Digite seu nome: ");
//String meuNome = teclado.readLine();
String meuNome = JOptionPane.showInputDialog("Digite seu nome");
//envia o nome digitado para o servidor
saida.println(meuNome.toUpperCase());
//instancia a thread para ip e porta conectados e depois inicia ela
Thread thread = new ClienteSocket(socket);
thread.start();
//Cria a variavel msg responsavel por enviar a mensagem para o servidor
String msg;
while (true) {
// cria linha para digitação da mensagem e a armazena na variavel msg
System.out.print("Mensagem > ");
msg = teclado.readLine();
// envia a mensagem para o servidor
saida.println(msg);
}
} catch (IOException e) {
System.out.println("Falha na Conexao... .. ." + " IOException: " + e);
}
}
// execução da thread
public void run() {
try {
//recebe mensagens de outro cliente através do servidor
BufferedReader entrada = new BufferedReader(new InputStreamReader(this.conexao.getInputStream()));
//cria variavel de mensagem
String msg;
while (true) {
// pega o que o servidor enviou
msg = entrada.readLine();
//se a mensagem contiver dados, passa pelo if, caso contrario cai no break e encerra a conexao
if (msg == null) {
System.out.println("Conexão encerrada!");
System.exit(0);
}
System.out.println();
//imprime a mensagem recebida
System.out.println(msg);
//cria uma linha visual para resposta
System.out.print("Responder > ");
}
} catch (IOException e) {
// caso ocorra alguma exceção de E/S, mostra qual foi.
System.out.println("Ocorreu uma Falha... .. ." + " IOException: " + e);
}
}
}
Servidor
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.*;
public class ServidorSocket extends Thread {
private static Map<String, PrintStream> MAP_CLIENTES;
private Socket conexao;
private String nomeCliente;
private static List<String> LISTA_DE_NOMES = new ArrayList<String>();
public ServidorSocket(Socket socket) {
this.conexao = socket;
}
public boolean armazena(String newName) {
for (int i = 0; i < LISTA_DE_NOMES.size(); i++) {
if (LISTA_DE_NOMES.get(i).equals(newName)) {
return true;
}
}
LISTA_DE_NOMES.add(newName);
return false;
}
public void remove(String oldName) {
for (int i = 0; i < LISTA_DE_NOMES.size(); i++) {
if (LISTA_DE_NOMES.get(i).equals(oldName)) {
LISTA_DE_NOMES.remove(oldName);
}
}
}
public static void main(String args[]) {
MAP_CLIENTES = new HashMap<String, PrintStream>();
try {
ServerSocket server = new ServerSocket(5555);
System.out.println("ServidorSocket rodando na porta 5555");
while (true) {
Socket conexao = server.accept();
Thread t = new ServidorSocket(conexao);
t.start();
}
} catch (IOException e) {
System.out.println("IOException: " + e);
}
}
public void run() {
try {
BufferedReader entrada = new BufferedReader(new InputStreamReader(this.conexao.getInputStream()));
PrintStream saida = new PrintStream(this.conexao.getOutputStream());
this.nomeCliente = entrada.readLine();
if (armazena(this.nomeCliente)) {
saida.println("Este nome ja existe! Conecte novamente com outro Nome.");
this.conexao.close();
return;
} else {
//mostra o nome do cliente conectado ao servidor
System.out.println(this.nomeCliente + " : Conectado ao Servidor!");
//Quando o cliente se conectar recebe todos que estão conectados
saida.println("Conectados: " + LISTA_DE_NOMES.toString());
}
if (this.nomeCliente == null) {
return;
}
//adiciona os dados de saida do cliente no objeto MAP_CLIENTES
//A chave será o nome e valor o printstream
MAP_CLIENTES.put(this.nomeCliente, saida);
String[] msg = entrada.readLine().split(":");
while (msg != null && !(msg[0].trim().equals(""))) {
send(saida, " escreveu: ", msg);
msg = entrada.readLine().split(":");
}
System.out.println(this.nomeCliente + " saiu do bate-papo!");
String[] out = {" do bate-papo!"};
send(saida, " saiu", out);
remove(this.nomeCliente);
MAP_CLIENTES.remove(this.nomeCliente);
this.conexao.close();
} catch (IOException e) {
System.out.println("Falha na Conexao... .. ." + " IOException: " + e +" Cliente "+this.nomeCliente);
}
}
/**
* Se o array da msg tiver tamanho igual a 1, então envia para todos Se o
* tamanho for 2, envia apenas para o cliente escolhido
*/
public void send(PrintStream saida, String acao, String[] msg) {
out:
for (Map.Entry<String, PrintStream> cliente : MAP_CLIENTES.entrySet()) {
PrintStream chat = cliente.getValue();
if (chat != saida) {
if (msg.length == 1) {
chat.println(this.nomeCliente + acao + msg[0]);
} else {
if (msg[1].equalsIgnoreCase(cliente.getKey())) {
chat.println(this.nomeCliente + acao + msg[0]);
break out;
}
}
}
}
}
}