Ajuda em Chat Java!

Preciso de idéias e códigos do que implementar nesse chat

pensei em fazer envio de arquivos ou fazer uma interface melhor, já que a janela é um text area e um textfield com o fundo preto com letras verdes

Ajudem-me com códigos e idéias
Derivei de outro chat algumas coisas e estou implementando o que consigo, mas sou bem iniciante
É trabalho final e preciso fazer algo bom!!

Servidor

/*
 *
*/
 
import java.net.*;
import java.io.*;
import java.util.*;

public class Servidor {
  public Servidor (int port) throws IOException {
    ServerSocket sSocket = new ServerSocket (port); //cria uma nova socket na porta port
    //loop infinito que fica a espera de clientes criando uma nova ligacao sempre que um usuário se conecta
    while (true) {
      Socket cSocket = sSocket.accept ();// espera por conexao
      System.out.println (">> Usuario conectado: " + cSocket.getInetAddress ());
      
      Chat c = new Chat (cSocket);// cria conexao
      c.start ();// inicia a thread
    }
  }

  public static void main (String args[]) throws IOException {
    if (args.length != 1)
      throw new RuntimeException ("»Erro: Servidor <port> \n(\"Falta numero da porta ou formato incorreto\")");
    new Servidor (Integer.parseInt (args[0]));
  }
}[/code]


[b]Cliente[/b]

[code]/**
 *
 */
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.SystemColor.*;
import javax.swing.*;
import java.awt.Component.*;

public class Cliente extends Frame implements Runnable {
  protected DataInputStream input;//i
  protected DataOutputStream output;//o

  protected TextArea taSaida;//saida
  protected TextField tfEntrada;//msgentrada;

  protected Thread listener;
  
  public Cliente (String title, InputStream input, OutputStream output) {
    super (title);
    this.input = new DataInputStream (new BufferedInputStream (input));
    this.output = new DataOutputStream (new BufferedOutputStream (output));
    setLayout (new BorderLayout ());
    add ("North", taSaida = new TextArea ());
    taSaida.setEditable (false);
    taSaida.setBackground(Color.BLACK);
    taSaida.setForeground(Color.GREEN);
    
    Font f=new Font("Verdana",Font.BOLD,12);
    taSaida.setFont(f);
    add ("South", tfEntrada = new TextField ());
    tfEntrada.setForeground(Color.BLUE);
    taSaida.setFont(f);
    pack ();
    show ();
 
    listener = new Thread (this);
    listener.start ();
    tfEntrada.requestFocus ();
  }

  public void run () {
    if (tfEntrada.equals("")){
    } else{
        try {
            while (true) {
                String line = input.readUTF ();
                taSaida.appendText (line + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace ();
        } finally {
            listener = null;
            tfEntrada.hide ();
            validate ();
            try {
                output.close ();
            } catch (IOException ex) {
                ex.printStackTrace ();
            }
        }
    }
  }

  public boolean handleEvent (Event e) {
    
        if ((e.target == tfEntrada) && (e.id == Event.ACTION_EVENT)) {
            try {
                output.writeUTF ((String) e.arg);
                output.flush ();
            } catch (IOException ex) {
                ex.printStackTrace();
                listener.stop ();
            }
            tfEntrada.setText ("");
            return true;
        } else if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)) {
            if (listener != null)
                listener.stop ();
            hide ();
            return true;
        }
        return super.handleEvent (e);
    }

  public static void main (String args[]) throws IOException {
      if (args.length != 2)
          throw new RuntimeException ("»Erro: Cliente <host> <port> \n(\"Servidor nao encontrado, numero ip e/ou numero da porta\")");
      Socket s = new Socket (args[0], Integer.parseInt (args[1]));
      new Cliente ("..::MaTrIX ChAt::..(para ajuda digite /help) [" + args[0] + "]:[" + args[1] + "]",s.getInputStream (), s.getOutputStream ());
  }
}

Informações Cliente

[code]/**
*
*
*/

import java.net.;
import java.io.
;
import java.util.*;

class conexao
{
public String pessoa;
public Chat c;//faz referencia ao objeto do cliente nome
conexao(String pessoa,Chat c)
{
this.pessoa=pessoa;
this.c=c;
}
}

public class Chat extends Thread {
protected Socket s;
protected DataInputStream i;
protected DataOutputStream o;

public Chat (Socket s) throws IOException {
this.s = s;
i = new DataInputStream (new BufferedInputStream (s.getInputStream ()));
o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ()));
}
//Cria vetores
protected static Vector handlers = new Vector ();
protected static Vector infoclient = new Vector ();//

//adiciona o nome do cliente ao vetor infoclient
public void adiciona_cliente(String pessoa,Chat c)
{
synchronized (infoclient) {
infoclient.addElement(new conexao(pessoa,c));
}
}

//envia mensagem privada
public void msg_privada(String usuario,String texto,Chat c,String quem)
{
conexao v;
try {
c.o.writeUTF (“Mensagem privada de: “+quem+” -”+texto);//envia a mensagem privada
c.o.flush ();
} catch (IOException ex) {

      c.stop ();
  }

}

public void run () {
String pessoa=null;
conexao v;
int a;
Chat r=null;
Enumeration e;
String array[]=null;

int existe;
try {
  String msg = null;
  pessoa="Visitante";//inicializa o nome como visitante 
  handlers.addElement (this);
  
  while (true) {
      msg = i.readUTF ();
      array=msg.split(" ");//divide o texto pelos espaços
      //  compara a primeira palavra com "/nick"
      if(msg.length()>5 && array[0].compareTo("/nick")==0)
      {
          if(array.length > 2)//se tiver espaços
          {
              try {
                  this.o.writeUTF ("»Não escreva espaços no nome!!!!!");
                  this.o.flush ();
              } catch (IOException ex) {
                  this.stop ();
              }
          }
          else
          {
              a=0;
            
              synchronized (infoclient) {
                  e=infoclient.elements(); 
                
                  while (e.hasMoreElements ()) {
                      v=(conexao)e.nextElement();
                      if(v.pessoa.compareTo(msg.substring(6))==0)
                          a=1; 
                  }
                  //se o nome ainda não existe adiciona o nome ao vector infoclient
                  if(a!=1)
                  {
                        adiciona_cliente( msg.substring(6),this );
                        pessoa=msg.substring(6);
                        broadcast ("»" + pessoa + " entrou...");
                  }
            else
            {
                try {
                   
                        this.o.writeUTF ("»Nick existente!");
                        this.o.flush ();
                } catch (IOException ex) {
                    this.stop ();
                }   
            }
        }
    }
    }
    else
        //compara a primeira palavra com "/mp"    
        if(msg.length()>3 && array[0].compareTo("/mp")==0)
        {
            
            if(array.length < 2)//testa se foi introduzido o nome do usuário destino
            {
                try {
                   this.o.writeUTF ("»Escreva o nome do destinatario!\n»Exemplo: /mp \"destinatario\" \"mensagem\"");
                   this.o.flush ();//limpa a fila
                } catch (IOException ex) {
                    this.stop ();//para a thread
                }
            }
            else
            {
            //não deixa o usuário Visitante enviar mensagens privadas
            if(pessoa.compareTo("Visitante")!=0)
            {
                array=msg.split(" ");//divide o texto
                String usuario=array[1];
                String texto=msg.substring(msg.indexOf(usuario)+array[1].length());
                synchronized (infoclient) {
                    e=infoclient.elements();
                    existe=0;
                    while (e.hasMoreElements ()) {
                        v=(conexao)e.nextElement();
                        System.out.println(pessoa);
                        //verifica se o usuário destino existe
                        //se existe envia a mensagem
                        if(v.pessoa.compareTo(usuario)==0)
                        {
                            existe=1;
                            r=v.c;//endereço
                            msg_privada(usuario,texto,r,pessoa);
                        }
                    }
                    
                }
                // se o usuário destino não existir da a informação
                if (existe==0)
                {
                    try {
                        this.o.writeUTF ("»O usuário "+usuario+" não existe!");
                        this.o.flush ();
                    } catch (IOException ex) {
                        this.stop ();
                    }    
                }       
            }
            }
        }
        else
            if(msg.length()==5 && array[0].compareTo("/list")==0)
            {
                synchronized (infoclient) {
                  e=infoclient.elements(); 
                  this.o.writeUTF ("\nUsuarios do ..::MaTrIX ChAt::..:");
                  while (e.hasMoreElements ()) {
                      v=(conexao)e.nextElement();
                      this.o.writeUTF (v.pessoa);
                       this.o.flush ();
                  }
                  this.o.writeUTF("\n");
                }
            }
            else
            {
            //verifica se a palavra escrita é /quit para sair
            if (msg.length()==5 && array[0].compareTo("/quit")==0)
            {
                handlers.removeElement (this);
                broadcast ("»" + pessoa + " Saiu...");
                
                synchronized (infoclient) {
                    e=infoclient.elements(); 
                //loop para ver se existe o nome de usuário introduzido
                while (e.hasMoreElements ()) {
                    v=(conexao)e.nextElement();
           
                    if(v.pessoa.compareTo(pessoa)==0){
                      
                        this.o.writeUTF (">>O cliente foi eliminado!!<<");
                        this.o.flush ();
                       
                        //elimina o cliente do vector se ele já etiver saido
                        infoclient.remove(infoclient.elementAt(infoclient.indexOf(v)));
                      
                    }
                }
                s.close();
                this.stop();
                
                }
                
            }
            //verifica se a palavra escrita é /help e informa os comandos
            else if (msg.length()==5 && array[0].compareTo("/help")==0)
            {
            	this.o.writeUTF ("» Comandos \n /nick digite /nick e seu nome\n /list para listar usuários do chat \n /mp \"nome\" \"mensagem\" para enviar mensagem privada \n /quit para sair ");
            	this.o.flush ();
            }
            
            //envia mensagem se o nome for diferente de "Visitante"
            if(pessoa.compareTo("Visitante")!=0)
                broadcast (pessoa + " - " + msg);
            else
            {
                try {
                        this.o.writeUTF ("»O seu nome ainda não foi registrado!\nEscreva: /nick \"nome\"");

                        this.o.flush ();
                } catch (IOException ex) {
                    this.stop ();
                }
            }
        }
  }
 
} catch (IOException ex) {
    ex.printStackTrace ();
} finally {
   
     try {
        s.close ();
     } catch (IOException ex) {
         ex.printStackTrace();
     }
}

}
//envia mensagem para todos
protected static void broadcast (String message) {
synchronized (handlers) {
Enumeration e = handlers.elements ();
while (e.hasMoreElements ()) {
Chat c = (Chat) e.nextElement ();
try {
synchronized (c.o) {
c.o.writeUTF (message);
}
c.o.flush ();
} catch (IOException ex) {
c.stop ();
}
}
}
}

}[/code]

Não vi o código, mas tem um exemplo de chat no próprio forum…
http://www.guj.com.br/posts/list/321.java ve se isso te ajuda

[quote=ffranceschi]Não vi o código, mas tem um exemplo de chat no próprio forum…
http://www.guj.com.br/posts/list/321.java ve se isso te ajuda[/quote]

Realmente muito bom esse chat citado
porém muito avançado e ainda por cima é em html

Mas vlw pela força

:wink:

Transferência de arquivos é sempre interessante.

Mas algo simples e bacana seria adicionar smilies.

[quote=LIPE]Transferência de arquivos é sempre interessante.

Mas algo simples e bacana seria adicionar smilies.[/quote]

Boa idéia!

tem algum código que eu posso implementar smiles?
sou iniciante e do nada não consigo sair do lugar

tem como me dar pelo menos um caminho de código?

:smiley:

O código que vai substituir o texto por smiles ficará no cliente - ou seja, o servidor não mandará arquivos de imagens para lá e para cá.

Portanto basta incluir um código que faça o parse das mensagens adicionadas ao painel com todas as mensagens, subsituindo um array pré-definido de caracteres pelas imagens, por exemplo “: - )” e “: D”.

[quote=LIPE]O código que vai substituir o texto por smiles ficará no cliente - ou seja, o servidor não mandará arquivos de imagens para lá e para cá.

Portanto basta incluir um código que faça o parse das mensagens adicionadas ao painel com todas as mensagens, subsituindo um array pré-definido de caracteres pelas imagens, por exemplo “: - )” e “: D”.[/quote]

como te disse sou iniciante e essa idéia de ser no cliente eu ja imaginava
a verdade é que tenho boas idéias e pouco conhecimento
tem como tu puxar um caminho de código para mim
no seco assim e não saio do lugar
como q colocarei as imagens
a verdade é que o primeiro paragrafo eu ja sabia
porém o segundo não entendi quase nada

:lol: :lol: :lol:

da um força para um iniciante em desespero

[quote=YoDa]Preciso de idéias e códigos do que implementar nesse chat

pensei em fazer envio de arquivos ou fazer uma interface melhor, já que a janela é um text area e um textfield com o fundo preto com letras verdes

Ajudem-me com códigos e idéias
Derivei de outro chat algumas coisas e estou implementando o que consigo, mas sou bem iniciante
É trabalho final e preciso fazer algo bom!!

Servidor

/*
 *
*/
 
import java.net.*;
import java.io.*;
import java.util.*;

public class Servidor {
  public Servidor (int port) throws IOException {
    ServerSocket sSocket = new ServerSocket (port); //cria uma nova socket na porta port
    //loop infinito que fica a espera de clientes criando uma nova ligacao sempre que um usuário se conecta
    while (true) {
      Socket cSocket = sSocket.accept ();// espera por conexao
      System.out.println (">> Usuario conectado: " + cSocket.getInetAddress ());
      
      Chat c = new Chat (cSocket);// cria conexao
      c.start ();// inicia a thread
    }
  }

  public static void main (String args[]) throws IOException {
    if (args.length != 1)
      throw new RuntimeException ("»Erro: Servidor <port> \n(\"Falta numero da porta ou formato incorreto\")");
    new Servidor (Integer.parseInt (args[0]));
  }
}[/code]


[b]Cliente[/b]

[code]/**
 *
 */
import java.net.*;
import java.io.*;
import java.awt.*;
import java.awt.SystemColor.*;
import javax.swing.*;
import java.awt.Component.*;

public class Cliente extends Frame implements Runnable {
  protected DataInputStream input;//i
  protected DataOutputStream output;//o

  protected TextArea taSaida;//saida
  protected TextField tfEntrada;//msgentrada;

  protected Thread listener;
  
  public Cliente (String title, InputStream input, OutputStream output) {
    super (title);
    this.input = new DataInputStream (new BufferedInputStream (input));
    this.output = new DataOutputStream (new BufferedOutputStream (output));
    setLayout (new BorderLayout ());
    add ("North", taSaida = new TextArea ());
    taSaida.setEditable (false);
    taSaida.setBackground(Color.BLACK);
    taSaida.setForeground(Color.GREEN);
    
    Font f=new Font("Verdana",Font.BOLD,12);
    taSaida.setFont(f);
    add ("South", tfEntrada = new TextField ());
    tfEntrada.setForeground(Color.BLUE);
    taSaida.setFont(f);
    pack ();
    show ();
 
    listener = new Thread (this);
    listener.start ();
    tfEntrada.requestFocus ();
  }

  public void run () {
    if (tfEntrada.equals("")){
    } else{
        try {
            while (true) {
                String line = input.readUTF ();
                taSaida.appendText (line + "\n");
            }
        } catch (IOException ex) {
            ex.printStackTrace ();
        } finally {
            listener = null;
            tfEntrada.hide ();
            validate ();
            try {
                output.close ();
            } catch (IOException ex) {
                ex.printStackTrace ();
            }
        }
    }
  }

  public boolean handleEvent (Event e) {
    
        if ((e.target == tfEntrada) && (e.id == Event.ACTION_EVENT)) {
            try {
                output.writeUTF ((String) e.arg);
                output.flush ();
            } catch (IOException ex) {
                ex.printStackTrace();
                listener.stop ();
            }
            tfEntrada.setText ("");
            return true;
        } else if ((e.target == this) && (e.id == Event.WINDOW_DESTROY)) {
            if (listener != null)
                listener.stop ();
            hide ();
            return true;
        }
        return super.handleEvent (e);
    }

  public static void main (String args[]) throws IOException {
      if (args.length != 2)
          throw new RuntimeException ("»Erro: Cliente <host> <port> \n(\"Servidor nao encontrado, numero ip e/ou numero da porta\")");
      Socket s = new Socket (args[0], Integer.parseInt (args[1]));
      new Cliente ("..::MaTrIX ChAt::..(para ajuda digite /help) [" + args[0] + "]:[" + args[1] + "]",s.getInputStream (), s.getOutputStream ());
  }
}

Informações Cliente

[code]/**
*
*
*/

import java.net.;
import java.io.
;
import java.util.*;

class conexao
{
public String pessoa;
public Chat c;//faz referencia ao objeto do cliente nome
conexao(String pessoa,Chat c)
{
this.pessoa=pessoa;
this.c=c;
}
}

public class Chat extends Thread {
protected Socket s;
protected DataInputStream i;
protected DataOutputStream o;

public Chat (Socket s) throws IOException {
this.s = s;
i = new DataInputStream (new BufferedInputStream (s.getInputStream ()));
o = new DataOutputStream (new BufferedOutputStream (s.getOutputStream ()));
}
//Cria vetores
protected static Vector handlers = new Vector ();
protected static Vector infoclient = new Vector ();//

//adiciona o nome do cliente ao vetor infoclient
public void adiciona_cliente(String pessoa,Chat c)
{
synchronized (infoclient) {
infoclient.addElement(new conexao(pessoa,c));
}
}

//envia mensagem privada
public void msg_privada(String usuario,String texto,Chat c,String quem)
{
conexao v;
try {
c.o.writeUTF (“Mensagem privada de: “+quem+” -”+texto);//envia a mensagem privada
c.o.flush ();
} catch (IOException ex) {

      c.stop ();
  }

}

public void run () {
String pessoa=null;
conexao v;
int a;
Chat r=null;
Enumeration e;
String array[]=null;

int existe;
try {
  String msg = null;
  pessoa="Visitante";//inicializa o nome como visitante 
  handlers.addElement (this);
  
  while (true) {
      msg = i.readUTF ();
      array=msg.split(" ");//divide o texto pelos espaços
      //  compara a primeira palavra com "/nick"
      if(msg.length()>5 && array[0].compareTo("/nick")==0)
      {
          if(array.length > 2)//se tiver espaços
          {
              try {
                  this.o.writeUTF ("»Não escreva espaços no nome!!!!!");
                  this.o.flush ();
              } catch (IOException ex) {
                  this.stop ();
              }
          }
          else
          {
              a=0;
            
              synchronized (infoclient) {
                  e=infoclient.elements(); 
                
                  while (e.hasMoreElements ()) {
                      v=(conexao)e.nextElement();
                      if(v.pessoa.compareTo(msg.substring(6))==0)
                          a=1; 
                  }
                  //se o nome ainda não existe adiciona o nome ao vector infoclient
                  if(a!=1)
                  {
                        adiciona_cliente( msg.substring(6),this );
                        pessoa=msg.substring(6);
                        broadcast ("»" + pessoa + " entrou...");
                  }
            else
            {
                try {
                   
                        this.o.writeUTF ("»Nick existente!");
                        this.o.flush ();
                } catch (IOException ex) {
                    this.stop ();
                }   
            }
        }
    }
    }
    else
        //compara a primeira palavra com "/mp"    
        if(msg.length()>3 && array[0].compareTo("/mp")==0)
        {
            
            if(array.length < 2)//testa se foi introduzido o nome do usuário destino
            {
                try {
                   this.o.writeUTF ("»Escreva o nome do destinatario!\n»Exemplo: /mp \"destinatario\" \"mensagem\"");
                   this.o.flush ();//limpa a fila
                } catch (IOException ex) {
                    this.stop ();//para a thread
                }
            }
            else
            {
            //não deixa o usuário Visitante enviar mensagens privadas
            if(pessoa.compareTo("Visitante")!=0)
            {
                array=msg.split(" ");//divide o texto
                String usuario=array[1];
                String texto=msg.substring(msg.indexOf(usuario)+array[1].length());
                synchronized (infoclient) {
                    e=infoclient.elements();
                    existe=0;
                    while (e.hasMoreElements ()) {
                        v=(conexao)e.nextElement();
                        System.out.println(pessoa);
                        //verifica se o usuário destino existe
                        //se existe envia a mensagem
                        if(v.pessoa.compareTo(usuario)==0)
                        {
                            existe=1;
                            r=v.c;//endereço
                            msg_privada(usuario,texto,r,pessoa);
                        }
                    }
                    
                }
                // se o usuário destino não existir da a informação
                if (existe==0)
                {
                    try {
                        this.o.writeUTF ("»O usuário "+usuario+" não existe!");
                        this.o.flush ();
                    } catch (IOException ex) {
                        this.stop ();
                    }    
                }       
            }
            }
        }
        else
            if(msg.length()==5 && array[0].compareTo("/list")==0)
            {
                synchronized (infoclient) {
                  e=infoclient.elements(); 
                  this.o.writeUTF ("\nUsuarios do ..::MaTrIX ChAt::..:");
                  while (e.hasMoreElements ()) {
                      v=(conexao)e.nextElement();
                      this.o.writeUTF (v.pessoa);
                       this.o.flush ();
                  }
                  this.o.writeUTF("\n");
                }
            }
            else
            {
            //verifica se a palavra escrita é /quit para sair
            if (msg.length()==5 && array[0].compareTo("/quit")==0)
            {
                handlers.removeElement (this);
                broadcast ("»" + pessoa + " Saiu...");
                
                synchronized (infoclient) {
                    e=infoclient.elements(); 
                //loop para ver se existe o nome de usuário introduzido
                while (e.hasMoreElements ()) {
                    v=(conexao)e.nextElement();
           
                    if(v.pessoa.compareTo(pessoa)==0){
                      
                        this.o.writeUTF (">>O cliente foi eliminado!!<<");
                        this.o.flush ();
                       
                        //elimina o cliente do vector se ele já etiver saido
                        infoclient.remove(infoclient.elementAt(infoclient.indexOf(v)));
                      
                    }
                }
                s.close();
                this.stop();
                
                }
                
            }
            //verifica se a palavra escrita é /help e informa os comandos
            else if (msg.length()==5 && array[0].compareTo("/help")==0)
            {
            	this.o.writeUTF ("» Comandos \n /nick digite /nick e seu nome\n /list para listar usuários do chat \n /mp \"nome\" \"mensagem\" para enviar mensagem privada \n /quit para sair ");
            	this.o.flush ();
            }
            
            //envia mensagem se o nome for diferente de "Visitante"
            if(pessoa.compareTo("Visitante")!=0)
                broadcast (pessoa + " - " + msg);
            else
            {
                try {
                        this.o.writeUTF ("»O seu nome ainda não foi registrado!\nEscreva: /nick \"nome\"");

                        this.o.flush ();
                } catch (IOException ex) {
                    this.stop ();
                }
            }
        }
  }
 
} catch (IOException ex) {
    ex.printStackTrace ();
} finally {
   
     try {
        s.close ();
     } catch (IOException ex) {
         ex.printStackTrace();
     }
}

}
//envia mensagem para todos
protected static void broadcast (String message) {
synchronized (handlers) {
Enumeration e = handlers.elements ();
while (e.hasMoreElements ()) {
Chat c = (Chat) e.nextElement ();
try {
synchronized (c.o) {
c.o.writeUTF (message);
}
c.o.flush ();
} catch (IOException ex) {
c.stop ();
}
}
}
}

}[/code][/quote]

Voce quer algo pronto…?
ou quer aprender…

se quiser algo pronto…pega net

Agora se quiser uma coisa simples que pareça que foi voce que fez…é só fazer o depósito na minha e conta e faço como voce o quiser!!!