Chat simples com sockets

3 respostas
L

Bom pessoal, fiz um chatzinho simples usando sockets..
Testei aqui no meu computador o servidor e o cliente e consegui
trocar mensagens normal.
Enviei o código do cliente pro meu amigo e fiquei com o do servidor. Rodei o servidor e ele rodou o cliente. Até aqui normal,
mas quando a gente tentou trocar mensagens, elas não eram enviadas e dava um erro no cmd.
Gostaria que alguem me ajudasse a resolver isso.

Aqui os códigos :

Servidor
import java.net.Socket;
import java.net.ServerSocket;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Server extends JFrame {

	JTextArea saida;
	JTextField entrada;
	
	BufferedReader leitor;
	PrintWriter w;
	private Socket socket1;
	
	public Server() throws Exception {
	    super("SkyFi Chat 1.0");
		
		Font fonte = new Font("SansSerif", Font.PLAIN, 16);
		
		entrada = new JTextField();
		entrada.setFont(fonte);
		
		
		saida = new JTextArea();
		saida.setFont(fonte);
		saida.setEditable(false);
		
		JButton botao = new JButton("Enter");
		botao.addActionListener(new ActionListener() {
		
		    public void actionPerformed(ActionEvent e) {

			    String t2 = entrada.getText();
				w.println(entrada.getText());
				w.flush();
				saida.append("You say: " + t2 + "\n");
				entrada.setText("");
				entrada.requestFocus();
	        } 
		});
		Container recebimento = new JPanel();
		recebimento.setLayout(new BorderLayout());
		recebimento.add(BorderLayout.NORTH, saida);
		recebimento.add(BorderLayout.CENTER, entrada);
		recebimento.add(BorderLayout.EAST, botao);
		
		getContentPane().add(BorderLayout.SOUTH, recebimento);
		getContentPane().add(BorderLayout.CENTER, saida);
		
		setSize(500,500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setVisible(true);
		
		configuraRede();
	}
	
    public static void main(String[] args) throws Exception {
     
     new Server();
	 
	}
	
	  public void configuraRede() throws Exception {
	  
	    ServerSocket servSocket = new ServerSocket(6000);
    	Socket socket1 = servSocket.accept();
		BufferedReader leitor = new BufferedReader(new InputStreamReader(socket1.getInputStream()));
		OutputStream out = socket1.getOutputStream();
		w = new PrintWriter(out);

	    String texto = null;
	
			try {
				while(true) {
				
				    if((texto=leitor.readLine())!=null) {
					
					 saida.append("Wallace says: " + texto + "\n");
				   } 
				}
			} catch (IOException e) {}

      }    
}
Cliente
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

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

public class Client extends JFrame {
	
	JTextField entrada;
	JTextArea saida;
	Socket socket;
	PrintWriter w;
	BufferedReader leitor;
	
	Client() throws Exception {
		super("SkyFi Chat 1.0");
		
		Font fonte = new Font("SansSerif", Font.PLAIN, 16);
		entrada = new JTextField();
		entrada.setFont(fonte);
		
		saida = new JTextArea();
		saida.setEditable(false);
		saida.setFont(fonte);
		
		JButton botao = new JButton("Enter");
		botao.addActionListener(new EnviarListener());
		Container envio = new JPanel();
		envio.setLayout(new BorderLayout());
		envio.add(BorderLayout.CENTER, entrada);
		envio.add(BorderLayout.NORTH, saida);
		envio.add(BorderLayout.EAST, botao);
		
		getContentPane().add(BorderLayout.SOUTH, envio);
		getContentPane().add(BorderLayout.CENTER, saida);
		
	    setSize(500,500);
	    setDefaultCloseOperation(EXIT_ON_CLOSE);
	    setVisible(true);
		
		configuraRede();
	}
	
	    private class EnviarListener implements ActionListener {

			@Override
			public void actionPerformed(ActionEvent e) {
				
				String t2 = entrada.getText();
				w.println(entrada.getText());
				w.flush();
				saida.append("You say: " + t2 + "\n");
				entrada.setText("");
				entrada.requestFocus();
				
			}
	    	
	    }

	private void configuraRede() throws Exception {
		socket = new Socket("localhost", 6000);
		OutputStream out = socket.getOutputStream();
		w = new PrintWriter(out);
		leitor = new BufferedReader(new InputStreamReader(socket.getInputStream()));
		
		String texto = null;
		
		try {
		    while(true) {
		        if((texto=leitor.readLine())!=null) {
			
			        saida.append("Lucas says: " + texto + "\n");
			    }
		    }
	    } catch(IOException e) {}
	} 
	
	public static void main(String[] args) throws Exception {
		new Client();
		
	}

}

3 Respostas

Rodrigo_Sasaki

Eu não li seu código, mas quem sabe isso te ajuda.

Não é pra nenhum dos 2 ficar “de servidor”. Cada um tem que abrir um client do chat pra isso funcionar. O servidor recebe a mensagem, e retorna pros 2

AndreSorge

Bom Dia lucasstoffel

Na apostila da Caelum tem um exemplo de “Msn” por socket, no livro do Deitel tb tem um exemplo,

o que o amigo Rodrigo Sasaki disse ta certo…mas pode ser assim também…

O servidor pode ser um cliente também…

mas a instancia do servidor só pode estar rodando em uma máquina…e o cliente em várias…

C

Salve lucasstoffel,

Cara não esquece que se você tiver um roteador não é a mesma coisa que realizar uma conexão local, pra funcionar uma conexão em rede na internet, você precisa liberar a porta que você utiliza na sua classe servidor.

Abraço

Criado 15 de abril de 2013
Ultima resposta 17 de abr. de 2013
Respostas 3
Participantes 4