如何得到访问者ip判断所在城市?高手帮忙!!!
解决方案 »
- FunsionCharts 关于鼠标移动到饼图上滚轮失效的问题
- javax.naming.NoInitialContextException
- 64位 03系统 和 32位,对js的影响大吗?
- jfreechart 精度问题
- 如何配置多个端口对应不同的应用
- 对于系统高峰时间并发量几万的文档下载,系统在这个模块应该进行哪些设计啊?
- 急!(在线等待)sqlserver2000数据库 设置setAutoCommit(false); 在查询了 一个记录后,对其进行修改,在提交事务时显示成功,但实际上没
- 判断不起作用,请各位看看
- 大哥大姐们帮忙啊。
- 请大家帮忙评价评价这两个权限分配的方案哪个好?
- struts中的一个标签问题?
- 用DetachedCriteria分页和四个条件组合查询时的问题?
如果你只想得到城市名称得话 ,你可以借助别人得IP库,否则就得自己建
所在的城市,就要使用IP库了。可以在网上CZ88IPScaner这个类。是别人写好的一个。
1.运行纯真QQIP数据库里带的ShowIP.exe,点解压,输入文件名,比如IP.txt,确定,就得到一个TXT文件。 2.打开ACCESS,工具-自定义,命令选项卡,把导入选项拖动到上面的工具栏。 3.建库,建一个表,四个字段 Startip 类型:文本 (相关城市的IP段信息)
Endip 类型:文本 (相关城市的IP段信息)
Country 类型:文本 (相关城市名称)
ReUrl 类型:文本 (你想要跳转的城市路径如:北京 http://bj.abc.com)4.点导入按钮,文件类型选文本文件,找到刚才导出的IP.txt文件,导入到刚才建的表里~运算将真实IP转换为数字,比如北京的IP段是 : 1.1.0.0 -- 1.1.0.255 Startip: 1*256*256*256+1*256*256+0*256+0 = 16842752 (这个数字才是最终要放到数据库里)Endip: 1*256*256*256+1*256*256+0*256+255 = 16843007 (这个数字才是最终要放到数据库里的)
最后就可以利用SQL语句查询数据库中的表来完成从ip地址到城市名的转换了。看到一个解决方法,但我看不明白
运算将真实IP转换为数字,比如北京的IP段是 : 1.1.0.0 -- 1.1.0.255 Startip: 1*256*256*256+1*256*256+0*256+0 = 16842752 (这个数字才是最终要放到数据库里)Endip: 1*256*256*256+1*256*256+0*256+255 = 16843007 (这个数字才是最终要放到数据库里的)是什么意思????
这个方式只是数据库记录ip域方式,楼主没有必要深究(不好意思刚才吃饭去了)
user_ip = Request.ServerVariables("REMOTE_ADDR") ''取得访问者IP
userip_ary=split(user_ip,".")
tmp_userip=userip_ary(0)*256*256*256+userip_ary(1)*256*256+userip_ary(2)*256+userip_ary(3) '' 按规定转换IP为数字
也就是说先将客户端ip通过计算成为上面的所谓域,然后再比较,那这个表达式的规律从何而来?
/**
*
* @author MoXie
*/
public class IpConver { private long ipLong = 0L;
private String ipString = new String(); public long ip2longFor4(String strIp) {
String[] ipStrList = strIp.split("\\."); int i = 3;
int cI = 0;
/* 6 << 2 = 24,4 << 2 = 16,2 << 2 = 8 */
//ip[0]*256*256*256+ip[1]*256*256+ip[2]*256+ip[3] 24 16 8;
String ip;
for (int j = 0; j < ipStrList.length; j++) {
ip = ipStrList[j];
// for (String ip : ipStrList) {
cI = i << 3;
i--;
ipLong += Long.valueOf(ip).intValue() << cI;
}
return getIpLong();
} public String long2ipFor4(long longIp) {
// Valid range: 0.0.0.0 -> 255.255.255.255
StringBuffer strIp = new StringBuffer();
int cI = 0;
if (longIp > 0L && longIp < 4294967295L) {
for (int i = 3; i >= 0; i--) {
cI = i << 3;
strIp.append((longIp >> cI) & 255);
if (i > 0) {
strIp.append(".");
}
}
}
return strIp.toString();
} public long getIpLong() {
return ipLong;
} public String getIpString() {
return ipString;
}
}
Php中就是 ip2long long2ip了。
举个例子吧:
Ip 库内:
127.0.0.1,127.0.0.5,A城市
127.0.0.9,127.0.0.20,B城市
为了高效我们将Ip转化为Long型存储,即:
355,359,A城市
363,374,A城市
客户Ip:
120.0.0.3 那么将它转化为Long即是 357
在 355,359 之间,所以这个客户来自A城市。
Ps.数字纯属模拟,非正常转换值。转换代码如上。
使用IP转城市区数据库就可以了官方下载地址:http://www.iptocity.cn/bbs/viewthread.php?tid=1&extra=page%3D1