2012-05-21 39 views
2

最近我不得不更換我的路由器,它是一個D-Link的Belking,我的程序使用我的貝爾金路由器工作,但現在不使用D-Link路由器。如何在Java中使用套接字和主機名?

這裏是我的程序:

客戶端:

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){} 
     } 
    } 
} 

這是我的服務器:

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(); 
    } 

} 

我已經在我的新的路由器打開一個端口,並更新動態DNS主機名.org但仍然保持發佈例外:

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) 

如果我更改主機名'valterhenrique.dyndns.info'它的工作原理,但這不是我想要的,我想與主機名一起工作,因爲我處於動態IP網絡中。

有什麼想法?

+0

如果將主機名更改爲其工作原理?一個IP地址? – jeff

+0

如果我更改爲「127.0.0.1」,它會起作用 –

+0

如果您執行'ping valterhenrique.dyndns.info' – jeff

回答

0

我認爲你需要允許外部訪問你的網絡。在Port Forwarding頁面(在路由器的配置頁面中)添加一個條目,將外部請求轉發到LAN中的特定地址。

+0

我已經做到了,看看這裏: http://i.imgur.com/eDvnd.png –

+0

和防火牆配置? – elias

+0

我應該如何配置防火牆? –

相關問題