I created a chat in java. it uses internal IP network but I want to change it to work with external ip also. What should I modify in my code?
Main Class:
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 conexao = new Conexao(ip, porta);
JanelaChat j = new JanelaChat(conexao);
j.setLocationRelativeTo(null);
j.setVisible(true);
}
Window chat
public class JanelaChat extends javax.swing.JFrame implements Observer {
private Conexao conexao;
public JanelaChat(Conexao conexao) {
// super("chat");
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);
}
}
private void enviarjButtonActionPerformed(java.awt.event.ActionEvent evt) {
envia();
}
private void mensagemjTextAreaKeyReleased(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
envia();
}
}
@Override
public void update(Observable o, Object arg) {
escreve(conexao.getMensagem());
}
and the connection of code is where I have the socket.
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[65508];
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);
socket.getReceiveBufferSize();
String s = new String(pacoteRecebido.getData(), pacoteRecebido.getOffset(), pacoteRecebido.getLength());
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;
}
}
}
}
}
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);
}
}
}
}
I'm learning this socket area still hopefully I have been clear in my codes.
Aucun commentaire:
Enregistrer un commentaire