使用我的公共IP创建ServerSocket java

时间:2013-02-08 20:38:26

标签: 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 {

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 public更改时总是更新。 首先,我得到了我的IP地址     InetAddress thisIp = InetAddress.getByName(“kiravaio.homepc.it”); 然后我创建了套接字:     server_socket = new ServerSocket(port,10,thisIp); 但它总是失败,我不知道为什么, 只在127.0.0.1上创建套接字才有效! :(

2 个答案:

答案 0 :(得分:4)

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

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

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

(如果您不知道如何操作,请查阅路由器手册或者将问题发布到https://superuser.com/

答案 1 :(得分:0)

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