Chat - Diferenciar usuários - + Help

2 respostas
K

Galera,então é o seguinte,preciso criar um chat em java nada muito difícil,o problema é que o chat tem que ser criado com Sockets,nada de Rmi e para o chat ser multiusuário preciso também usar threads,mas estou tendo problemas em diferenciar os usuários,eu preciso criar uma lista de usuários, e preciso que o meu servidor os reconheça para poder mandar mensagens privadas,é ai onde estou patinando,como posso diferenciar os users e mandar mensagens privadas?Estou usando um PrinterWrite encadedo com BufferedReader e um socket,acho eu que não vou conseguir fazer usando PrinterWriter,mas então o que devo usar?Estou postando o código abaixo pra vcs darem uma olhada:

Server :
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;



public class server {
	ArrayList mensagens;
	boolean desligar = true;
	int contar = 1;
	JFrame tela;
	JPanel painel;
	JButton btnOff;	
	
public void ui () {
		tela = new JFrame();
		painel = new JPanel();
		btnOff = new JButton("Desligar");
		btnOff.addActionListener(new btnListner());
		painel.add(btnOff);
		tela.add(painel);
		tela.setSize(100,100);
		tela.setVisible(true);
		
		
	}
 public class btnListner implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent arg0) {
	   desligar = false;
		
	}
	 
	 
 }
	
	
	public class suporte implements Runnable  {
		BufferedReader reader;
		Socket sock;
		
		public suporte (Socket clientSocket){
			try{
				sock =  clientSocket;
				InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
				reader= new BufferedReader(isReader);
				
				
			}catch (Exception e) {
				e.printStackTrace();
								
			}
		}

		
		public void run() {
			String mensagem;
			try {
				while((mensagem = reader.readLine())!=null){
					System.out.println("read" + mensagem);
					Iterator it = mensagens.iterator();
		        	while(it.hasNext()){        		
		        	try{	
		        		PrintWriter writer = (PrintWriter) it.next();
		        	    writer.println(" "+ mensagem );  
		        		writer.flush();
		        			        		
		        	}catch (Exception e) {
						e.printStackTrace();
					}
		        }
			}
				
			}catch(Exception ex){
				ex.printStackTrace();
			}
			
			
			
		}
		 
	}
	
	
        public static void main(String args[]){
        	server s = new  server();
        	s.ui();
        	s.go();
        }
        
        public void go (){
        	mensagens = new ArrayList();
        	 try {
        		 ServerSocket serverSocket= new ServerSocket(5074);
        		 while(desligar==true){
        			 Socket clienteSocket = serverSocket.accept();
        			 PrintWriter writer  =  new PrintWriter(clienteSocket.getOutputStream());
        			 mensagens.add(clienteSocket.getInetAddress());
        			 mensagens.add(writer);
        			 Thread t = new Thread(new suporte(clienteSocket));
        			 t.start();
    			     System.out.println("Conectado");        			      			 
        		 }
        		 System.out.println("Sever Desligado");
        	 }catch (Exception e) {
					e.printStackTrace();
				}
        }
      }
Cliente :
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;


public class chatCliente {
	JTextArea incoming;
	JTextField outcoming;
	JTextField Jtnome;
	JLabel Jlnome;
	BufferedReader reader;
	PrintWriter  writer;
	Socket sock;
	
	public static void main (String args[]){
		
		chatCliente c = new chatCliente();
		c.go();		
	}

	
	public void go (){
    JFrame frame = new JFrame("BatChat - WayneProductions");
	JPanel mainpPanel = new JPanel();
	incoming = new JTextArea(15,50);
	incoming.setLineWrap(true);
	incoming.setWrapStyleWord(true);
	incoming.setEditable(false);
	JScrollPane qrScroller = new JScrollPane(incoming);
	qrScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
	qrScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
	outcoming = new JTextField(20);
	Jtnome = new JTextField(10);
	Jlnome = new JLabel("Nome: ");
	JButton sendButton = new JButton("Enviar");
	sendButton.addActionListener(new SendButtonListner());
	mainpPanel.add(qrScroller);
	mainpPanel.add(Jlnome);
	mainpPanel.add(Jtnome);
	mainpPanel.add(outcoming);
	mainpPanel.add(sendButton);
	setUpNetworking();
	
	Thread  readerThread = new Thread(new IncomingReader());
	readerThread.start();
	
	frame.getContentPane().add(BorderLayout.CENTER,mainpPanel);
    frame.setSize(600,600);
    frame.setVisible(true);
}
	
	private void setUpNetworking (){		
		try{
		sock = new Socket("127.0.0.1",5074);
		InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
		reader = new BufferedReader(streamReader);
		writer = new PrintWriter(sock.getOutputStream());
		System.out.print("conectado");
		System.out.println(sock.getLocalAddress());
			
		}catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
	
	public class SendButtonListner implements ActionListener {

		
		public void actionPerformed(ActionEvent e) {
			try {
				
				
				writer.print(Jtnome.getText()+": ");
				writer.println(outcoming.getText());
				writer.flush();
				
				
			}catch(Exception ex){
				ex.printStackTrace();
		
			}
		outcoming.setText("");
		outcoming.requestFocus();
			
		}
		
}
	
	public class IncomingReader implements Runnable {
		public void run () {
			String mensagem;
			 try {
				 while((mensagem = reader.readLine())!=null){
					 System.out.println("read"+mensagem);
					 incoming.append(mensagem+"\n");
					 
				 }
				 
			 }catch(Exception ex){
				 ex.printStackTrace();
			 }
			
		}
	}
	
}

2 Respostas

lucaz.cabral

Também preciso de ajuda com um chat em java. Não sei o que está havendo pois o cliente não fica conectado ao servidor. Dá um erro ao enviar mensagem ao servidor, falando que a conexão foi fechada.

Servidor

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class ChatServer implements Runnable {
	
	private static final int PORTA = 45054;
	private static List<Socket> lista = new ArrayList<Socket>();
	private Socket cliente;

	public ChatServer(Socket cliente) {
		this.cliente = cliente;
	}

	@Override
	public void run() {
		DateFormat dateFormat = DateFormat.getDateInstance();
		System.out.println("["+dateFormat.format(new Date())+"] Atendendo Cliente ("+cliente.getInetAddress().getHostAddress()+").");
		while(this.cliente.isConnected()){
			try {
				BufferedReader entrada = new BufferedReader(new InputStreamReader(this.cliente.getInputStream()));
				String usuario = entrada.readLine();
				String msg = entrada.readLine();
				entrada.close();
				if(!msg.equals("Sair")){
					System.out.println(usuario+" disse: "+msg);
					if(!msg.isEmpty()){
						for (Socket usuarioLogado : lista) {
							BufferedWriter saida = new BufferedWriter(new OutputStreamWriter(usuarioLogado.getOutputStream()));
							saida.write(usuario+" disse: "+msg);
							saida.newLine();
							saida.flush();
							saida.close();
						}
					}
				}else{
					System.out.println("["+dateFormat.format(new Date())+"] Cliente ("+cliente.getInetAddress().getHostAddress()+") desconectado.");
					cliente.close();
					atualizaLista();
				}
			} catch (IOException e) {
				System.err.println("Erro: "+e.getMessage());
				System.exit(-1);
			}
		}
	}

	private void atualizaLista() {
		for (int i=0; i<lista.size(); i++) {
			if(lista.get(i).isClosed()){
				lista.remove(i);
				i--;
			}
		}
	}

	public static void main(String[] args) {
		try {
			DateFormat dateFormat = DateFormat.getDateInstance();
			System.out.println("["+dateFormat.format(new Date())+"] Inicializando Servidor de chat.");
			ServerSocket servidor = new ServerSocket(PORTA);
			System.out.println("["+dateFormat.format(new Date())+"] Servidor de chat executando na porta "+PORTA+".");
			System.out.println("["+dateFormat.format(new Date())+"] Aguardando conexões de Clientes.");
			while(true){
				Socket cliente = servidor.accept();
				System.out.println("["+dateFormat.format(new Date())+"] Conexão aceita de Cliente ("+cliente.getInetAddress().getHostAddress()+").");
				lista.add(cliente);
				new ChatServer(cliente).run();
			}
		} catch (IOException e) {
			System.err.println("Erro: "+e.getMessage());
			System.exit(-1);
		}
		
	}
}

Cliente

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.util.Date;
import java.util.Scanner;

public class ChatClient implements Runnable {
	
	private static final int PORTA = 45054;
	private static String nomeUsuario;
	private Socket cliente;

	public ChatClient(Socket cliente2) {
		this.cliente = cliente2;
	}

	@Override
	public void run() {
		while(this.cliente.isConnected()){
			BufferedReader entrada;
			try {
				entrada = new BufferedReader(new InputStreamReader(this.cliente.getInputStream()));
				String msg = entrada.readLine();
				entrada.close();
				System.out.println(msg);
			} catch (IOException e) {
				System.err.println("Erro: "+e.getMessage());
				System.exit(-1);
			}
		}
	}

	public static void main(String[] args) {
		if(args.length==0 || args[0].length()==0 || args[1].length()==0){
			System.out.println("Uso incorreto. Tente:\n\t" +
					"java ChatCliente ><ip ou hostname> <nome de usuario>");
			System.exit(-1);
		}
		try {
			Scanner scan = new Scanner(System.in);
			DateFormat dateFormat = DateFormat.getDateInstance();
			System.out.println("<"+dateFormat.format(new Date())+"> Conectando ao Servidor de chat.");
			Socket cliente = new Socket(args[0], PORTA);
			nomeUsuario = args[1];
			System.out.println("<"+dateFormat.format(new Date())+"> Iniciando serviço de mensagens.");
			System.out.println("<"+dateFormat.format(new Date())+"> Pronto para envio e recebimento de mensagens.");
			System.out.println("Digite uma mensagem e pressione enter para enviá-la ou digite 'Sair' para desconectar.");
			String msg;
			do{
				msg = scan.nextLine();
				if(!msg.equals("Sair")){
					//System.out.println("<"+dateFormat.format(new Date())+"> Enviando mensagem ao servidor.\n\t"+msg);
					BufferedWriter saida = new BufferedWriter(new OutputStreamWriter(cliente.getOutputStream()));
					saida.write(nomeUsuario);
					saida.newLine();
					saida.write(msg);
					saida.newLine();
					saida.flush();
					saida.close();
				}
			}while (cliente.isConnected() || !msg.equals("Sair"));
			System.out.println("<"+dateFormat.format(new Date())+"> Cliente se desconectou do Servidor de chat.");
			cliente.close();
		} catch (UnknownHostException e) {
			System.err.println("Erro: "+e.getMessage());
			System.exit(-1);
		} catch (IOException e) {
			System.err.println("Erro: "+e.getMessage());
			System.exit(-1);
		}
	}

}
FernandoFranzini

Dentro do servidor de socket vc pode criar uma coleção q guarde os identificados de usuários…para que quando alguem enviar uns objeto de mensagems, tb venha o usuário destino…o servidor tem que receber a mensagem e depois reenviar para para o cliente.
Seu código ta bem ruim…vc ter q refatorar muito…

Criado 21 de setembro de 2011
Ultima resposta 22 de set. de 2011
Respostas 2
Participantes 3