Chat Simples em Java
Atualizado em:
Esse é um exemplo simples do uso de conexões no Java (DatagramSocket), ele se conecta em outro IP na rede e há a troca de mensagens.
Como executar: Informe o IP de outro computador, e neste outro o IP do seu, a porta deve ser a mesma.
Baixe o .jar aqui, ou veja o código abaixo:
Utilizo também neste projeto o padrão de projetos Observador
Conexao.java
package chatsimples; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.Observable; import java.util.logging.Level; import java.util.logging.Logger; public class Conexao extends Observable { private String ip; private int porta; private String mensagem; public Conexao(String ip, int porta) { this.ip = ip; this.porta = porta; new Thread(new Recebe()).start(); } public String getMensagem() { return mensagem; } public String getIp() { return ip; } public int getPorta() { return porta; } public void envia(String texto) { new Thread(new Envia(texto)).start(); } public void notifica(String mensagem) { this.mensagem = mensagem; setChanged(); notifyObservers(); } class Recebe implements Runnable { byte[] dadosReceber = new byte[255]; boolean erro = false; DatagramSocket socket = null; @Override public void run() { while (true) { try { socket = new DatagramSocket(getPorta()); } catch (SocketException ex) { Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); } erro = false; while (!erro) { DatagramPacket pacoteRecebido = new DatagramPacket(dadosReceber, dadosReceber.length); try { socket.receive(pacoteRecebido); byte[] b = pacoteRecebido.getData(); String s = ""; for (int i = 0; i < b.length; i++) { if (b[i] != 0) { s += (char) b[i]; } } String nome = pacoteRecebido.getAddress().toString() + " disse:"; notifica(nome + s); } catch (Exception e) { System.out.println("erro"); try { Thread.sleep(100); } catch (InterruptedException ex) { Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); } erro = true; continue; } } } } } class Envia implements Runnable { String texto; public Envia(String texto) { this.texto = texto; } @Override public void run() { byte[] dados = texto.getBytes(); try { DatagramSocket clientSocket = new DatagramSocket(); InetAddress addr = InetAddress.getByName(getIp()); DatagramPacket pacote = new DatagramPacket(dados, dados.length, addr, getPorta()); clientSocket.send(pacote); clientSocket.close(); } catch (SocketException ex) { Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); } catch (UnknownHostException ex) { Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(Conexao.class.getName()).log(Level.SEVERE, null, ex); } } } }
JanelaChat.java
package chatsimples; import java.awt.event.KeyEvent; import java.util.Observable; import java.util.Observer; public class JanelaChat extends javax.swing.JFrame implements Observer { private Conexao conexao; public JanelaChat(Conexao conexao) { super("Chat Simples em Java by @pcollares"); this.conexao = conexao; initComponents(); conexao.addObserver(this); escreve("Chat iniciado com " + conexao.getIp() + ":" + conexao.getPorta()); mensagemjTextArea.requestFocusInWindow(); } private void envia() { if (!mensagemjTextArea.getText().isEmpty()) { conexao.envia(mensagemjTextArea.getText()); escreve("Você disse: "+mensagemjTextArea.getText()); mensagemjTextArea.setText(""); } } private void escreve(String texto){ chatjTextArea.append(texto+"\n"); if (!chatjTextArea.getText().isEmpty() && !chatjTextArea.isFocusOwner()) { chatjTextArea.setCaretPosition(chatjTextArea.getText().length() - 1); } } @SuppressWarnings("unchecked") //private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); chatjTextArea = new javax.swing.JTextArea(); jScrollPane2 = new javax.swing.JScrollPane(); mensagemjTextArea = new javax.swing.JTextArea(); enviarjButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); chatjTextArea.setEditable(false); chatjTextArea.setColumns(20); chatjTextArea.setRows(5); jScrollPane1.setViewportView(chatjTextArea); mensagemjTextArea.setColumns(20); mensagemjTextArea.setRows(5); mensagemjTextArea.addKeyListener(new java.awt.event.KeyAdapter() { public void keyReleased(java.awt.event.KeyEvent evt) { mensagemjTextAreaKeyReleased(evt); } }); jScrollPane2.setViewportView(mensagemjTextArea); enviarjButton.setText("Enviar"); enviarjButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { enviarjButtonActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane1) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 386, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(enviarjButton, javax.swing.GroupLayout.DEFAULT_SIZE, 75, Short.MAX_VALUE)) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 349, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false) .addComponent(jScrollPane2) .addComponent(enviarjButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addGap(0, 0, Short.MAX_VALUE)) ); pack(); }// private void enviarjButtonActionPerformed(java.awt.event.ActionEvent evt) { envia(); } private void mensagemjTextAreaKeyReleased(java.awt.event.KeyEvent evt) { if (evt.getKeyCode() == KeyEvent.VK_ENTER) { envia(); } } // Variables declaration - do not modify private javax.swing.JTextArea chatjTextArea; private javax.swing.JButton enviarjButton; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextArea mensagemjTextArea; // End of variables declaration @Override public void update(Observable o, Object arg) { escreve(conexao.getMensagem()); } }
Programa.java
package chatsimples; import javax.swing.JOptionPane; public class Programa { public static void main(String[] args) { String ip = (String)JOptionPane.showInputDialog("Informe o IP","192.168.0."); int porta = Integer.parseInt(JOptionPane.showInputDialog("Informe a Porta","5000")); Conexao c = new Conexao(ip, porta); JanelaChat j = new JanelaChat(c); j.setLocationRelativeTo(null); j.setVisible(true); } }
Deixe um comentário