2012-05-21 26 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

我应该如何配置防火墙? –

相关问题