jeudi 23 juin 2016

How to change local IP for external in chat using sockets

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