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