Ajuda com aplicação chat (socket)

7 respostas
V

Gostaria de pedir ajuda a todos do fórum, estou tentando desenvolver um chat, e segue o meu codigo abaixo para que alguém possa me dizer porque não consigo obter os dados de um List:

LADO SERVIDOR:

package br.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Vagner Duarte
 */
public class RecebeCliente implements Runnable{

private Socket socket;
private List<String> clientes;

    public RecebeCliente(Socket socket) {
        this.socket = socket;
    }
    
  public void run() {
        try {
            BufferedReader entrada = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            String ip = socket.getInetAddress().getHostAddress();
            String nome = entrada.readLine();
            System.out.println(ip);
            System.out.println(nome);
            clientes = new ArrayList<String>();
            clientes.add(ip);
            clientes.add(nome);
            conectados(clientes, socket);

            } catch (IOException ex) {
            ex.printStackTrace();
            }
     }
  private void conectados(List <String> cli, Socket socket){
    this.clientes = cli;

        for (int i=0; i<=clientes.size();i++){
            try {
             ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
            saida.writeObject(clientes);

           } catch (IOException ex) {
                Logger.getLogger(RecebeCliente.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

}

LADO CLIENTE:

package br.cliente;

import java.io.BufferedWriter;
import java.io.ObjectInputStream;
import java.io.OutputStreamWriter;
import java.net.ConnectException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author Vagner Duarte
 */
public class ClienteSocket {
    private String ip;
    private String nome;


    public ClienteSocket() {
    }

    public ClienteSocket(String ip, String nome) {
        this.ip = ip;
        this.nome = nome;
    }
    public void conectanoservidor(){
        
        try {
            Socket cliente = new Socket(ip, 5555);

            BufferedWriter saida2 = new BufferedWriter(new OutputStreamWriter(cliente.getOutputStream()));
            saida2.write(nome);
            saida2.flush();
            ObjectInputStream entrada = new ObjectInputStream(cliente.getInputStream());
            List<String> conexao = (List<String>) entrada.readObject();

            for (int i = 0; i<= conexao.size(); i++){
            System.out.println(conexao);
            //não sai nada, a aplicação trava....

            }

            saida2.close();
            cliente.close();

          }
        catch (UnknownHostException ex) {
            ex.printStackTrace();
        }
        catch (ConnectException erro) {
            JOptionPane.showMessageDialog(null, "O servidor não esta Disponível ou o Ip fornecido\n"
                    +" para Localizar o Servidor esta incorreto!!");
        }
        catch (Exception e){
        e.printStackTrace();
        }
    }

}

7 Respostas

rodrigo.bossini

Cadê o seu objeto ServerSocket? Você deu um accept nele?

V

Sim, veja o código em que faço isso:

public class Servidor {


    public void executa(){
        try {

            ServerSocket srv = new ServerSocket(5555);
            

            System.out.println("Servidor Aguardando cliente na porta 5555");

            while (true){
            Socket socket = srv.accept();
            RecebeCliente receber = new RecebeCliente(socket);
            new Thread (receber).start();
             }
        }

        catch (IOException ex) {
            ex.printStackTrace();
        }

    }
    }
rodrigo.bossini

O servidor chega a imprimir o ip e nome do cliente? Talvez esteja faltando um flush depois do writeObject.

V

sim se eu tirar o restante do código e deixar só até o momento que ele imprime o nome e o ip do cliente funciona perfeitamente. O problema ta quando adiciono esse cliente em uma lista com o nome e o ip. Deixa eu explicar o que to fazendo e me ajuda na lógica ai. conforme o codigo la o servidor fica rodando aguardando novos clientes, ai toda vez que chega um novo cliente ele cria uma nova thead, essa thead obtem o nome e o ip do cliente e adiciona em uma lista, assim o servidor vai possuir uma lista que tem todos os clientes conectados, então toda vez que conectar um cliente ele manda o ip de todo mundo para aquele novo cliente, então esse cliente vai ter todos os ip e os nomes e poderá se conectar a ele quando quiser para conversar…ta legal isso??

ViniGodoy

Seu chat precisa ser p2p?

Se não precisar, é mais fácil fazer o cliente enviar a mensagem para o servidor e o servidor repassar a mensagem para todos os clientes que estão na lista. Assim os clientes só precisam se conectar com o servidor, não entre si.

V

mas eu preciso que o cliente envie mensagem somente para um cliente e não para todos os clientes. Tipo ele recebe a lista de todos conectados e poderá escolher com quem falar e enviar a mensagem somente a quem quiser não para todos.

ViniGodoy

Eu acho mais simples fazer o chat cliente/server pois aí você só tem que programar uma aplicação servidora. Da forma que você está fazendo, cada cliente do seu chat também terá que ser um potencial servidor.

No caso, basta estabelecer então um procotolo, em que o cliente X diga ao servidor que quer enviar a mensagem para um cliente Y. O servidor então recebe essa mensagem, vai na lista dele e só repassa para o cliente certo.

Você também tem que especificar nesse protocolo como os clientes irão se descobrir uns aos outros. O servidor poderia, por exemplo, passar para cada cliente conectado uma lista com o nome de todas as pessoas online. E depois ter mensagens de atualização dessa lista.

Um cliente que feche “graciosamente” também poderia enviar ao servidor, antes de fechar, uma mensagem de “adeus”. Isso garante que o servidor notifique os outros imediatamente da desconexão. Além disso, seria bom também implementar algumas mensagens de keep alive, entre o cliente e o servidor (o TCP/IP até tem um protocolo próprio, mas é muito lento).

Comece descrevendo em detalhes seu procotolo e pensando em todas essas situações. Aí, com uma visão clara do que seu chat terá que ser capaz de fazer, você começa a codificação.

Criado 31 de maio de 2010
Ultima resposta 1 de jun. de 2010
Respostas 7
Participantes 3