【问题标题】:How work with socket and hostnames in Java?如何在 Java 中使用套接字和主机名?
【发布时间】:2012-05-21 20:09:06
【问题描述】:

最近我不得不更换我的路由器,它是一个用于一个 D-Link 的 Belking,我的程序与我的 Belkin 路由器一起工作,但现在不能与 D-Link 路由器一起工作。

这是我的程序:

客户:

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

}

我已经在我的新路由器中打开了一个端口,并在 DynDns.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 网络中。

有什么想法吗?

【问题讨论】:

  • 如果您将主机名更改为有效的名称? IP 地址?
  • 如果我改成127.0.0.1 就可以了
  • 如果您执行 'ping valterhenrique.dyndns.info',您的计算机是否解析到正确的 IP
  • 如果您总是在本地连接,您可以通过null 代替任何主机名或IP 地址。
  • @jeff 它确实 ping 正确。

标签: sockets ip hostname dynamic-ip


【解决方案1】:

我认为您需要允许外部访问您的网络。在Port Forwarding 页面(在路由器的配置页面中)添加一个条目,将外部请求转发到 LAN 中的特定地址。

【讨论】:

  • 防火墙配置呢?
  • 我应该如何配置防火墙?
  • 尝试将 DMZ 主机配置为 IP 192.168.1.2。但要注意安全性。
猜你喜欢
  • 2017-11-07
  • 2010-09-14
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2021-10-07
  • 2012-03-12
  • 2014-08-15
  • 2020-02-04
相关资源
最近更新 更多