How work with socket and hostnames in Java?

4.2k views Asked by At

Recently I had to change my router, it was an Belking for one D-Link, my program worked it with my Belkin router but not now with the D-Link router.

Here is my program:

The client:

package brainset.socket;

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;

/**
 *
 * @author Valter
 */
public class Client {  

    public static void main(String[] args) {  

        Socket s = null;  

        PrintStream ps = null;  

        try{  

            s = new Socket("valterhenrique.dyndns.info", 40000);  

            ps = new PrintStream(s.getOutputStream());  

            ps.println("lamp");  

        }catch(IOException e){  

            System.out.println("Some problem happens.");  
            e.printStackTrace();

        }finally{  

            try{  
                s.close();  
            }catch(IOException e){}  
        }  
    }  
}

And here's my server:

package brainset.socket;

// imports

public class Server {
    private Supervisory supervisory;

    public Server(Supervisory supervisory) {
        this.supervisory = supervisory;
    }

    public void start() {
        ThreadServer ts = new ThreadServer();
        Thread t = new Thread(ts);
        t.start();
    }

    class ThreadServer extends Thread {

        public void run() {
            ServerSocket ss = null;

            Socket socket = null;

            BufferedReader br = null;

            try {

                ss = new ServerSocket(40000);
                socket = ss.accept();
                br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                String message;
                while ((message = br.readLine()) != null) {
                    System.out.println("message:" + message);
                    try {
                        if (message.equals("lamp")) {
                            supervisory.active();
                            supervisory.switchLamp();
                        } else if (message.contains("airConditioning")) {
                            String airConditioning[] = message.split(":");
                            // temperature[0] = 'temperature'
                            // temperature[1] = temperature value
                            supervisory.active();
                            supervisory.changeTemperature(Float.parseFloat(airConditioning[1]));
                        }
                    } catch (Exception ex) {
                        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    }

                    socket = ss.accept();
                    br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                }

            } catch (IOException ioe) {

                ioe.printStackTrace();
            } finally {

                try {
                    socket.close();
                    ss.close();

                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }
        }
    }

    public static void main (String args[]){
        Server s = new Server(new Supervisory("192.168.1.149", "192.168.1.255", 101));
        s.start();
    }

}

I already opened a port in my new router and update the hostname in DynDns.org but still keeping launching an exception:

java.net.ConnectException: Connection refused: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:189)
at brainset.socket.Client.main(Client.java:28)

If I change the hostname 'valterhenrique.dyndns.info' it works, but this is not what I want, I want to works with the hostname because I'm in a dynamic ip network.

Any idea ?

1

There are 1 answers

3
elias On

I think you need permit external access to your network. In the Port Forwarding page (in the router's configuration page) add a entry that forwards the external requests to a specific address in your LAN.