我在用java做一个C/S的程序,想在服务器上获取客户端的IP,该如何获取?
注:客户端可能用的NAT设备,所以在客户端调用InetAddress.getLocalHost()得到的是客户端的内网ip,例如:192.168.1.12,
    而我想在服务器得到的是该用户的公网IP地址,请问谁有过类似的经验,谢谢

解决方案 »

  1.   

    你真小气···
    import java.net.URL;
    import java.util.Date;
    import java.io.InputStream;
    import java.net.URLConnection;
    import java.io.InputStreamReader;
    public class GetOnerIp {
        String OutPutStream = new String();
        int a;
        char b;
        int power = 1;
        String c = null;
        String res;
        URLConnection urlcon;
        public GetOnerIp() {
        }
        public static void main(String[] args) {
            GetOnerIp getonerip = new GetOnerIp();
            try {
                getonerip.chaojiip();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        public String dayinji(int power, char d) {
          
            if (power == 1) {
                res = String.valueOf(d);
            } else {
                res = "";
            }
            return res;
        }
        public String chaojiip() throws Exception {
            // TODO 自动生成方法存根
            URL url = new URL("http://www.cz88.net/ip/viewip468.aspx");
            System.out.println("主机:" + url.getHost());
            System.out.println("路径:" + url.getPath());
            System.out.println("端口:" + url.getPort());
            System.out.println("文件:" + url.getFile());        urlcon = url.openConnection();
            System.out.println("超时设置:" + urlcon.getConnectTimeout());
            System.out.println("当前时间:" + new Date(urlcon.getLastModified()));
            System.out.println("==content==");        int i = urlcon.getContentLength();
            if (i > 0) {
                InputStream isr = urlcon.getInputStream();
                InputStreamReader is = new InputStreamReader(isr, "GB2312");            
                int spower = 0;
                while ((a = is.read()) != -1) {
                    b = (char) a;
                    OutPutStream = OutPutStream + "" + dayinji(power, b);
                    c = String.valueOf(b);
                    if (OutPutStream.indexOf("IPMessage\">") > 0) {
                        OutPutStream = "";
                        power = 1;
                        spower = 1;
                    }
                    if (spower == 1) {
                        if (c.equalsIgnoreCase("<")) {
                            power = 0;
                        }
                    }
                }
                OutPutStream = OutPutStream.replaceAll(">", "");
                OutPutStream = OutPutStream.replaceAll("", "");
                OutPutStream = OutPutStream.replaceAll("<", "");
                System.out.println("您的IP是:" + OutPutStream); //.replaceAll(">",""));
                OutPutStream.indexOf("|");
                is.close();
            } else {
                System.out.println("Length is null.");
            }
            return OutPutStream;
        }
    }你看看吧··是用HttpConnection来实现的··
    不过很傻···
    是调取别人网页上的东西··然后进行分析···
    你看看吧····
      

  2.   

    request.getheader(“user-agent”)返回客户端浏览器的版本号、类型getheader(string name):获得http协议定义的传送文件头信息,request. getmethod():获得客户端向服务器端传送数据的方法有get、post、put等类型request. getrequesturi():获得发出请求字符串的客户端地址request. getservletpath():获得客户端所请求的脚本文件的文件路径request. getservername():获得服务器的名字request.getserverport():获得服务器的端口号request.getremoteaddr():获得客户端的ip地址request.getremotehost():获得客户端电脑的名字,若失败,则返回客户端电脑的ip地址request.getprotocol():request.getheadernames():返回所有request header的名字,结果集是一个enumeration(枚举)类的实例request.getheaders(string name):返回指定名字的request header的所有值,结果集是一个enumeration(枚举)类的实例
      

  3.   

    上面两位老兄,我不是已经说了是C/S的架构吗,客户端不是用的浏览器啊,不过问题已经解决了,客户端主动想Server发送
    一个数据包之后Server就可以获取到客户端的公网IP的