Como faço para conectar sockets em rede externa

Amigos, estou com uma certa dificuldade em conectar um chat desenvolvido usando sockets em uma rede externa, para que os usuarios não precisem estar em uma rede local.
segue abaixo o código utilizado.

CODIGO DO SERVIDOR

package servidor;
import java.net.*;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;

public class Servidor {

public static void main(String[] args){
   
    ArrayList<PrintStream> clientes = new ArrayList<>();
    
    try{
  ServerSocket server = new ServerSocket(5000);
    Socket socket;
       
    while(true){
    
        socket = server.accept();
        
        
        clientes.add(new PrintStream (socket.getOutputStream()));
        Mensagem mensagem = new Mensagem(socket, clientes);
        
    
        }    
    }
    catch(IOException e){
        e.printStackTrace();
    }

}

}

CODIGO DO CLIENTE

package Cliente;

import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.;
import static javax.swing.JOptionPane.
;
public class Chat extends javax.swing.JFrame {

private String nome;
private Socket s;
private BufferedReader br;
private InputStreamReader isr;

public Chat(String nome) {
    
    initComponents();
    
    this.nome = nome;
    try{
        s = new Socket("localhost",5000);
    }
    catch(IOException e){
        showMessageDialog(null, "Não se Conectou ao servidor","",ERROR_MESSAGE);
        System.exit(0);
    }
    Thread();
}
private void Thread(){
    
    Thread t = new Thread(new Runnable() {
    
       String mensagem; 
        
    @Override
    public void run() {
        
        try{
        isr = new InputStreamReader(s.getInputStream());
        br = new BufferedReader(isr);
        
        while((mensagem = br.readLine()) != null){
            
            mensagemRecebida.setText(mensagemRecebida.getText()+ mensagem + "\n");
            
        }
        
        }
        catch(IOException e){
            
            showMessageDialog(null, "Erro na conexão com o servidor", "", ERROR_MESSAGE);
            
        }
         }    
    });

t.start();
}
@SuppressWarnings(“unchecked”)
// //GEN-BEGIN:initComponents
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    mensagemRecebida = new javax.swing.JTextArea();
    jScrollPane2 = new javax.swing.JScrollPane();
    mensagemEnviada = new javax.swing.JTextArea();
    jButton1 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    mensagemRecebida.setColumns(20);
    mensagemRecebida.setRows(5);
    jScrollPane1.setViewportView(mensagemRecebida);

    mensagemEnviada.setColumns(20);
    mensagemEnviada.setRows(5);
    mensagemEnviada.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            mensagemEnviadaKeyPressed(evt);
        }
    });
    jScrollPane2.setViewportView(mensagemEnviada);

    jButton1.setText("Enviar");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                .addComponent(jScrollPane1)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                    .addComponent(jButton1)))
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 175, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addComponent(jScrollPane2)
                .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
    );

    pack();
}// </editor-fold>//GEN-END:initComponents

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
   
    String mensagem = nome + " disse: ";
   
    try{
   PrintStream ps = new PrintStream(s.getOutputStream());
   mensagem += mensagemEnviada.getText();
   
   ps.println(mensagem);
   ps.flush();
   
   mensagemEnviada.setText("");
   }
   catch(IOException e){
        showMessageDialog(null, "Não conseguiu enviar a mensagem","",ERROR_MESSAGE);
   }
   
}//GEN-LAST:event_jButton1ActionPerformed

private void mensagemEnviadaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_mensagemEnviadaKeyPressed
   
    if(evt.getKeyCode() == KeyEvent.VK_ENTER){
        
        String mensagem = nome + " disse: ";
   
    try{
   PrintStream ps = new PrintStream(s.getOutputStream());
   mensagem += mensagemEnviada.getText();
   
   ps.println(mensagem);
   ps.flush();
   
   mensagemEnviada.setText("");
   }
   catch(IOException e){
        showMessageDialog(null, "Não conseguiu enviar a mensagem","",ERROR_MESSAGE);
   }
    }
    
}//GEN-LAST:event_mensagemEnviadaKeyPressed

// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton jButton1;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea mensagemEnviada;
private javax.swing.JTextArea mensagemRecebida;
// End of variables declaration//GEN-END:variables

}