怎样通过Java程序 获取本机IP地址..试了几种方法都不行 获取的都是192.168.*.*这种.想得到网络IP那种,求

怎样通过Java程序 获取本机IP地址..试了几种方法都不行 获取的都是192.168.*.*这种.想得到网络IP那种,求,第1张

在JSP里,获取客户端的IP地址的方法是:requestgetRemoteAddr(),这种方法在大部分情况下都是有效的。但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实IP地址了。

如果使用了反向代理软件,用requestgetRemoteAddr()方法获取的IP地址是:127001 或 1921681110,而并不是客户端的真实IP。

经过代理以后,由于在客户端和服务之间增加了中间层,因此服务器无法直接拿到客户端的IP,服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中,增加了X-FORWARDED-FOR信息。用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。当我们访问 时,其实并不是我们浏览器真正访问到了服务器上的indexjsp文件,而是先由代理服务器去访问 ,代理服务器再将访问到的结果返回给我们的浏览器,因为是代理服务器去访问indexjsp的,所以indexjsp中通过requestgetRemoteAddr()的方法获取的IP实际上是代理服务器的地址,并不是客户端的IP地址。

于是可得出获得客户端真实IP地址的方法一:

public String getRemortIP(HttpServletRequest request) {

if (requestgetHeader("x-forwarded-for") == null) {

return requestgetRemoteAddr();

}

return requestgetHeader("x-forwarded-for");

}

可是当我访问 时,返回的IP地址始终是unknown,也并不是如上所示的127001 或 1921681110了,而我访问 :2046/indexjsp 时,则能返回客户端的真实IP地址,写了个方法去验证。原因出在了Squid上。squidconf 的配制文件 forwarded_for 项默认是为on,如果 forwarded_for 设成了 off 则:X-Forwarded-For: unknown

于是可得出获得客户端真实IP地址的方法二:

public String getIpAddr(HttpServletRequest request) {

String ip = requestgetHeader("x-forwarded-for");

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetHeader("Proxy-Client-IP");

}

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetHeader("WL-Proxy-Client-IP");

}

if(ip == null || iplength() == 0 || "unknown"equalsIgnoreCase(ip)) {

ip = requestgetRemoteAddr();

}

return ip;

}

可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串Ip值,究竟哪个才是真正的用户端的真实IP呢?

答案是取X-Forwarded-For中第一个非unknown的有效IP字符串。

如:X-Forwarded-For:1921681110, 1921681120, 1921681130, 1921681100用户真实IP为: 1921681110

网络通信可分为两种模式:TCP有连接的通信

UDP无连接的通信

依照上述的问题我可以理解为你是要进行有连接的通信。是要经过三次握手才能实现可靠的连接

第一次:建立连接时三次握手,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN(Synchronize Sequence Numbers)同步序列号。

服务器端即可使用:

Socket s=serverSocketaccept();

String clientIP=sgetInetAddress()toString();

这就实现了java服务器端获取到连接此服务器的客户端的IP了,你若想实现获取所有连接此服务器的客户端的IP,你可以把每次accept()返回的socket放进全局的Vector里面,然后在遍历这个vector方法就同上代码咯……

java获取ip地址

public static void main(String[] args) { try { // 获取计算机名 String name = InetAddressgetLocalHost()getHostName(); // 获取IP地址 String ip = InetAddressgetLocalHost()getHostAddress(); Systemoutprintln("计算机名:"+name); Systemoutprintln("IP地址:"+ip); } catch (UnknownHostException e) { Systemoutprintln("异常:" + e); eprintStackTrace(); } }

所以javascript可以通过ajax技术来获得后端语言得到的IP,并返回到前端。

1:通过java的servlet获取IP:

public String getRemoteAddress(HttpServletRequest request) {

String ip = requestgetHeader("x-forwarded-for");

  if (ip == null || iplength() == 0 || ipequalsIgnoreCase("unknown")) {

ip = requestgetRemoteAddr();

}

return ip;

}

如果是用反向代理技术的话requestgetHeader("x-forwarded-for");会有值,

一般情况下,只要requestgetRemoteAddr();就可以了。

2:获取MAC:

public String getMACAddress(String ip) {

String str = "";

String macAddress = "";

try {

Process p = RuntimegetRuntime()exec("nbtstat -a " + ip);

InputStreamReader ir = new InputStreamReader(pgetInputStream());

LineNumberReader input = new LineNumberReader(ir);

for (int i = 1; i < 100; i++) {

str = inputreadLine();

if (str != null) {

//if (strindexOf("MAC Address") > 1) {

if (strindexOf("MAC") > 1) {

macAddress = strsubstring(

strindexOf("=") + 2, strlength());

break;

}

}

}

} catch (IOException e) {

eprintStackTrace(Systemout);

}

return macAddress;

}

通过命令nbtstat -a ip来获得该ip相对应的mac地址。

B系统内部当然可以加上验证IP的步骤,不过与其在服务代码中加,还不如直接配置到tomcat的配置文件中

方法是在tomcat的conf/serverxml(jboss也是serverxml,搜一下就找到了,不同版本貌似路径不一样)

在这个文件的localhost的<Host>元素加入如下<Valve>元素,deny属性的值即阻止的ip,如果只想配置允许的ip,则应该配置allow属性,多个ip以竖杠分隔比如下面这个配置的就是阻止两个IP

<Host name="localhost" appBase="webapps"

unpackWARs="true" autoDeploy="true">

<Valve className="orgapachecatalinavalvesRemoteAddrValve" deny="127001|1921681150"/>

</Host>

allow和deny是有优先级的,deny优先级大于allow,即如果deny="127001",allow="127001",那么你用127001的IP去访问,是被禁止的

另外如果你只想配置allow,就不要去配置deny反之如果我这边只想配置deny,不要去配置allow

配置为空""和不配置是两码事,比如我如果误加上allow="",这表示谁都不允许

这个恐怕要到服务器查才能知道~~就像玩私服~服务器改了IP~~会公布新IP给玩家更改客户端的服务器IP~~如果你的不是互联网,而是局域网~就可以向你所在的局域网中所有IP都发个信息,那个有回应,那个就是服务器~这是一个笨方法。。。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 怎样通过Java程序 获取本机IP地址..试了几种方法都不行 获取的都是192.168.*.*这种.想得到网络IP那种,求

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情