2013-02-08 40 views
1

好创建的ServerSocket java的,这里是我的代码:我的公网IP

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

+1

当你说“公共IP”,你的意思是你的路由器的IP?因为你的电脑只能在自己的网络设备上打开套接字,iirc。 – 2013-02-08 20:39:58

+0

我的意思是,如果我去http://www.whatsmyip.org我得到我的公共IP,我想将它绑定在一个套接字中...以便我可以接受连接请求... – user1576208 2013-02-08 20:44:22

+0

请参阅Brian Roach的答案;在编写需要联网的程序之前,您应该学习网络的基础知识。 – 2013-02-08 20:47:00

回答

4

仰望homepc.it显示这是一个动态DNS服务域名。该域名解析为IP与您路由器不是你的电脑。

你的PC将有一个私网IP地址(例如192.168.1.x)(您的PC正在使用该IP与正在执行NAT(网络地址转换)的路由器进行通信)

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

(如果你不知道该怎么做,您应该咨询您的路由器的说明书或者是发布问题https://superuser.com/

+0

我不知道有一个服务告诉你,如果一个域注册为dyndns;是whois的一部分还是有单独的工具呢? – 2013-02-08 20:48:12

+0

@ G.Bach - 如果您只是将'homepc.it'放入您的浏览器,它会将您重定向到意大利的dyndns;) – 2013-02-08 20:52:44

+0

那么谁知道,做有时会产生结果的显而易见的东西:D – 2013-02-08 20:56:06

0

我强烈认为,ServerSocket的,你不需要指定IP地址将被使用,只是做新的ServerSocket(端口),客户端应该能够通过您的动态域进行连接。

+1

你是对的,没有指定IP会导致它绑定到'0.0.0.0'('INADDR_ANY')......这会导致你错误的地方。在他的PC上,这将是“127.0.0.1”,以及路由器分配给它的任何私有的,不可路由的IP地址。这就是为什么当他试图特别绑定他的dyndns主机名时失败的原因;它解决了他的路由器的IP,而不是他的PC。 – 2013-02-08 21:29:53