使用我的公共IP创建ServerSocket java

使用我的公共IP创建ServerSocket java,java,ip,serversocket,Java,Ip,Serversocket,这是我的代码: 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 { publi

这是我的代码:

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上创建套接字。 我有一个域名 kiravaio.homepc.it 每次我的ip公共更改时总是更新。 首先,我用 InetAddress thisIp=InetAddress.getByName(“kiravaio.homepc.it”); 然后我创建套接字: server_socket=新的ServerSocket(端口,10,thisIp); 但它总是失败,我不知道为什么, 只有在127.0.0.1上创建套接字才有效!
:(

查找
homepc。它显示这是一个dyndns服务域名。该域名解析为路由器的IP,而不是您的PC

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

您必须绑定到该地址(或者只需使用只接受一个端口的
ServerSocket
的构造函数;这将绑定到
0.0.0
INADDR\u ANY
)并侦听所有接口),然后配置路由器将您选择的端口转发到该IP地址


(如果你不知道怎么做,你应该查阅路由器手册,或者发一个问题到)

查找
homepc。它显示这是一个dyndns服务域名。该域名解析为路由器的IP,而不是你的PC

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

您必须绑定到该地址(或者只需使用只接受一个端口的
ServerSocket
的构造函数;这将绑定到
0.0.0
INADDR\u ANY
)并侦听所有接口),然后配置路由器将您选择的端口转发到该IP地址



(如果你不知道怎么做,你应该查阅你的路由器手册,或者发一个问题到)

我坚信,对于ServerSocket,你不需要指定要使用哪个ip地址,只需使用新的ServerSocket(端口)而且客户端应该能够通过动态域连接。

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

当您说“公共ip”时,你是说你的路由器的IP吗?因为你的计算机只能在自己的网络设备上打开套接字,iirc。我的意思是,如果我去,我会得到我的公共IP,我想把它绑定在一个套接字中…这样我就可以接受连接请求…见Brian Roach的答案;在编写需要网络的程序之前,你应该先学习网络的基本知识tworking。老实说……我不明白!如果我把程序绑定到本地ip上,那么……我怎么能从外部访问这个程序?我应该使用公共ip,对吗?别误会,我不是在训斥你;当你试图编写使用它的程序时,只需要了解网络。要回答你的问题,请阅读Brian Roach的ans当你说“公共知识产权”时,你是说你的路由器的IP吗?因为你的计算机只能在自己的网络设备上打开套接字,iirc。我的意思是,如果我去,我会得到我的公共IP,我想把它绑定在一个套接字中…这样我就可以接受连接请求…见Brian Roach的答案;在编写需要网络的程序之前,你应该先学习网络的基本知识tworking。老实说……我不明白!如果我把程序绑定到本地ip上,那么……我怎么能从外部访问这个程序?我应该使用公共ip,对吗?别误会,我不是在训斥你;当你试图编写使用它的程序时,只需要了解网络。要回答你的问题,请阅读Brian Roach的answer.我不知道有一个服务会告诉你一个域名是否为dyndns注册;这是whois的一部分还是有单独的工具?@G.Bach-如果你把
homepc.it
放进你的浏览器,它会将你重定向到意大利的dyndns;)谁知道呢,做显而易见的事情有时会产生结果:我像那样愚蠢;总是先尝试显而易见的事情。令人惊讶的是,它实际上在很多时候都有效-DI不知道有一个服务会告诉你一个域名是否为dyndns注册;这是whois的一部分还是有单独的工具?@G.Bach-如果你把
homepc.it
放到你的浏览器中,它会将你重定向到意大利的dyndns;)谁知道呢,做一些显而易见的事情有时确实会产生结果:我就是那样的哑巴;总是先尝试显而易见的事情。令人惊讶的是,它实际上在很多时候都有效-如果您是正确的,不指定IP将导致它绑定到
0.0.0
INADDR\u ANY
)。。。这导致你错了。在他的电脑上,这将是
127.0.0.1
,以及他的路由器分配给它的任何私有的、不可路由的IP地址。这就是为什么当他试图特别绑定到他的dyndns主机名时失败的原因;它解析到他的路由器的IP,而不是他的PC。没错,不指定IP将导致它绑定到
0.0.0.0
INADDR\u ANY
)。。。这导致你错了。在他的电脑上,这将是
127.0.0.1
,以及他的路由器分配给它的任何私有的、不可路由的IP地址。这就是为什么当他试图特别绑定到他的dyndns主机名时失败的原因;它解析为他的路由器的IP,而不是他的PC。