Comunicação cliente/servidor

Estou a desenvolver uma aplicação cliente servidor que estou a lutar já algumas semanas que esta a gerar um erro quando executo o cliente em outra máquina: Estabelecar conexão…
Erro no cliente: java.net.ConnectException: Connection refused: connect
BUILD SUCCESSFUL (total time: 1 second).

package client;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.Mensagem;
import util.Status;

public class Client {

public static void main(String[] args) {
    try {
        /*
        1. Estabelecer uma conexao com o servidor
        2. trocar mensagem com o servidor
        */
        //criar a conexao entre o cliente e o servidor
        System.out.println("Estabelecar conexão.......");
        Socket socket=new Socket("localhost",5555);
        System.out.println("Conexão estabelecida.......");
        //criação dos strem de entrada e saida
        
        
        ObjectOutputStream output=new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream input=new ObjectInputStream(socket.getInputStream());
        
        System.out.println("Enviar mensagem......");
        
        Mensagem m=new Mensagem("Div");
        m.setParam("op1",2);
        m.setParam("op2",30);
        
        output.writeObject(m);
        output.flush();//libera o bufffer para envio
       
        System.out.println("Mensagem "+m+" enviada.");
        
        m=(Mensagem)input.readObject();
        System.out.println("Resposta do servidor"+m);
        
        if(m.getStatus()==Status.OK){
            float resposta=(float) m.getParam("res");
            System.out.println("Mensagem :\n"+resposta);
        }else{
        
            System.out.println("Erro :"+m.getStatus());
        
        
        }
        
        input.close();
        output.close();
        socket.close();
    
    } catch (IOException ex) {
        System.out.println("Erro no cliente: "+ex);
    } catch (ClassNotFoundException ex) {
        System.out.println("Erro no cast: "+ex.getMessage());
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
    }
}

}

Servidor

package server;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.Mensagem;
import util.Status;

public class Server {

private ServerSocket serverSocket;

private void criarServerSocket(int porta) throws IOException {
    
    serverSocket = new ServerSocket(porta);
    
}

private Socket esperaConexao() throws IOException {
    Socket socket = serverSocket.accept();
    return socket;
}

private void fecharSocket(Socket s) throws IOException {
    
    s.close();
}

private void trataConexao(Socket socket) throws IOException {
    //ponto entre o cliente -------sokect-----servidor
    // protocolo de de comunicação
    //Criar strems de entrada e saída
    //tratar a conversa entre cliente e serfvidor(tratar protocolo)
    try {
        
        ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream());
        ObjectInputStream input = new ObjectInputStream(socket.getInputStream());
        /*protocolo
        Cliente -------> Hello
            server<--------Hello word
         */
        System.out.println("Tratando.......");
        
        Mensagem m = (Mensagem) input.readObject();
        System.out.println("Menssagem do Cliente:\n"+m);
        
        String operacao = m.getOperacao();
        Mensagem reply = null;
        
        if (operacao.equals("HELLO")) {
            
            String nome = (String) m.getParam("nome");
            String sobrenome = (String) m.getParam("sobrenome");
            
            reply = new Mensagem("HELLOREPLY");
            
            if (nome == null || sobrenome == null) {
                reply.setStatus(Status.PARAMERROR);
            } else {
                reply.setStatus(Status.OK);
                reply.setParam("mensagem", "Hello World" + nome + " " + sobrenome);
            }
        }
        if (operacao.equalsIgnoreCase("DIV")) {
            try {
                Integer op1 = (Integer) m.getParam("op1");
                Integer op2 = (Integer) m.getParam("op2");
                
                reply = new Mensagem("DIVREPLY");
                if (op2 == 0) {
                    reply.setStatus(Status.DIVZERO);
                } else {
                    reply.setStatus(Status.OK);
                    float div=op2/op1;
                    reply.setParam("res", div);
                }
            } catch (Exception e) {
                
                reply = new Mensagem("DIVREPLY");
                reply.setStatus(Status.PARAMERROR);
                
            }
            
        }
        
        output.writeObject(reply);
        output.flush();

        //4.2- fechar strem de entrada e saída
        input.close();
        output.close();
        
    } catch (IOException e) {
        System.out.println("Problema de tratamento da conexão com o cliente" + socket.getInetAddress());
        System.out.println("Erro: " + e.getMessage());
    } catch (ClassNotFoundException ex) {
        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
    } finally {
        //final do tratamento do protocolo
        //4.1-Fechar socket de comunicação ente servidor/Cliente
        fecharSocket(socket);
        
    }
    
}

public static void main(String[] args) {
    
    try {

//até que o processo não seja interropido ele vai ficar a repetir ou a espera

        Server server = new Server();
        System.out.println("Aguardando conexão");
        server.criarServerSocket(5555);
        while (true) {
            Socket socket = server.esperaConexao();//protocolo
            System.out.println("Cliente Conecatado");
            //Outro prosesoo
            server.trataConexao(socket);
            System.out.println("Cliente finalizado");
        }
    } catch (IOException ex) {
        //trata exceção
        System.out.println("Erro no servidor" + ex.getMessage());
    }
}

}

O problema é exatamente o descrito acima: executar o cliente em outra máquina, requer que a configuração seja ajustada para acesso a partir de outro local, que não o localhost.

Ao instanciar um objeto de Socket, um dos construtores recebe dois parâmetros: uma String que representa a url ou IP do servidor e um int que representa a porta através da qual a conexão será estabelecida.
Quando cliente e servidor rodam na mesma máquina, utilizar localhost como primeiro parâmetro é correto e irá funcionar. A partir do momento que cada um é executado em máquinas distintas, precisa ajustar o primeiro parâmetro, para o ip da máquina onde o servidor socket está rodando.

Já coloque o Socket socket=new Socket(“192.168.12.14”,5555); está a dar o mesmo erro

Tem certeza que consegue “pingar” da máquina onde o cliente está para a máquina onde o servidor se encontra?

Não consigo pinga da máquina servidor para o cliente

mais consigo pingar do cliente para a máquina servidora

Teoricamente, se consegue pingar, não teria problemas em conseguir a conexão.

Libere a porta 5555 no firewall.

Estou a verificar está situação