【问题标题】:Create ServerSocket java with my public IP使用我的公共 IP 创建 ServerSocket java
【发布时间】:2013-02-08 20:38:25
【问题描述】:

好吧,这是我的代码:

import java.io.InputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.ServerSocket;
import java.net.InetAddress;
import java.net.UnknownHostException;

public class TcpServerEcho {

public static void main(String argv[]) {

    int port = Integer.parseInt(argv[0]);
    ServerSocket server_socket = null;


    try {

        InetAddress thisIp = InetAddress.getByName("kiravaio.homepc.it");
        System.out.println(thisIp.getHostAddress());

        //or
        //server_socket = new ServerSocket(port, 10, InetAddress.getByName("79.47.49.68"));
        server_socket = new ServerSocket(port, 10, thisIp);

    }
    catch (Exception e) {
        System.err.println("Impossible to create socket server!");
        System.out.flush();
        System.exit(1);
    }

    System.out.printf("Server active on port: %d and on address %s\n", port, server_socket.getInetAddress());


    Socket client_socket = null;
    boolean exec = true;

    while(exec) {


        try {

            client_socket = server_socket.accept();

            InputStream is = client_socket.getInputStream();

            OutputStream os = client_socket.getOutputStream();

            boolean stop = false;

            System.out.println("Received: ");

            while(!stop) {
                int b = is.read();
                System.out.print((char)b);
                if(b == -1) {stop = true;}
                else {os.write( (byte)b );}
            }


        }

        catch (IOException ioe) {
            System.err.println("Error I/O!");
        } finally {
            try {
                client_socket.close();
            }

            catch (IOException ioe) {}
            }

        System.out.println("");
    }


    try {
        /* Never executed */
        server_socket.close();
    } catch (IOException ioe) {}
}

}

我无法在我的公共 IP 上创建套接字。 我有一个域 kiravio.homepc.it 每次我的 ip public 更改时总是更新。 所以首先,我得到我的IP地址 InetAddress thisIp = InetAddress.getByName("kiravaio.homepc.it"); 然后我创建套接字: server_socket = new ServerSocket(port, 10, thisIp); 但它总是失败,我不知道为什么, 仅在 127.0.0.1 上创建套接字有效! :(

【问题讨论】:

  • 你说的“公网IP”是指路由器的IP吗?因为你的电脑只能在自己的网络设备上打开套接字,iirc。
  • 我的意思是,如果我去whatsmyip.org,我会得到我的公共 ip,我想将它绑定到一个套接字中......这样我就可以接受连接请求......
  • 见 Brian Roach 的回答;在编写需要联网的程序之前,您应该学习联网的基础知识。
  • 老实说……我不明白!如果我在本地 ip 上绑定程序,那么......我怎样才能从外部访问这个程序?我应该使用公共 IP 对吗?
  • 别误会,我没有告诉你;当您尝试编写使用它的程序时,只需要了解网络。要回答您的问题,请阅读 Brian Roach 的回答。

标签: java ip serversocket


【解决方案1】:

查找homepc.it 发现这是一个 dyndns 服务域名。该域名解析到您的 路由器 的 IP,而不是您的 PC。

您的 PC 将有一个由您的路由器分配给它的专用网络 IP 地址(例如 192.168.1.x)(您的 PC 使用该 IP 与执行 NAT(网络地址转换)的路由器通信) .

你必须绑定到那个地址(或者简单地使用ServerSocket的构造函数,它只接受一个端口;这将绑定到0.0.0.0(INADDR_ANY)并监听所有接口),并将你的路由器配置为将您选择的端口转发到该 IP 地址。

(如果你不知道怎么做,你应该查阅你的路由器手册或者向https://superuser.com/提问)

【讨论】:

  • 我不知道有一个服务可以告诉你一个域是否注册了 dyndns;那是whois的一部分还是有单独的工具呢?
  • @G.Bach - 如果您只是将 homepc.it 输入浏览器,它会将您重定向到意大利的 dyndns ;)
  • 谁知道呢,做显而易见的事情有时确实会产生结果:D
  • 我就是那样的笨;总是先尝试明显的。令人惊讶的是,它实际上在很多时候都有效。 :-D
【解决方案2】:

我坚信对于 ServerSocket,您不需要指定要使用的 ip 地址,只需执行 new ServerSocket(port) 并且客户端应该能够通过您的动态域进行连接。

【讨论】:

  • 你是对的,不指定 IP 会导致它绑定到 0.0.0.0 (INADDR_ANY) ...这导致你错了。在他的 PC 上,这将是 127.0.0.1 以及他的路由器分配给它的任何私有、不可路由的 IP 地址。这就是为什么当他尝试专门绑定到他的 dyndns 主机名时它失败的原因;它解析到他的路由器的 IP,而不是他的 PC。
猜你喜欢
  • 2011-05-14
  • 1970-01-01
  • 2023-02-02
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多