`
kong0itey
  • 浏览: 304678 次
社区版块
存档分类
最新评论

世界ip地址查询,包括数据库和查询代码[原创]

    博客分类:
  • java
阅读更多
这是我整理的一个ip地址查询数据库,希望能对大家有点帮助,我已经在我的项目里用了。
经过测试,在我的机器上查询一个ip大约耗时0.016秒,查询结果与ip138大部分一致

使用方法:
1.导入下面的sql脚本(本人是从mysql导出来的)
2.参照下面程序中得search方法,数据库相关参数记得改成你自己的,加上驱动包

import java.io.*;
import java.sql.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class Test {

	private static Connection conn;
	private static String driver = "com.mysql.jdbc.Driver"; 
	private static String ulr = "jdbc:mysql://数据库ip:3306/数据库名";
	private static String username = "数据库用户名";
	private static String pwd = "数据库密码";

	static {
		try {
			Class.forName(driver);
			conn = DriverManager.getConnection(ulr, username, pwd);
			conn.setAutoCommit(false);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			System.exit(-1);
		} catch (SQLException e) {
			e.printStackTrace();
			System.exit(-1);
		}
	}

	/**
	 * @param args
	 * @throws IOException
	 * @throws SQLException
	 */
	public static void main(String[] args) throws IOException, SQLException {
		for (int i = 0; i < 50; i++) {
			testSearch();
		}
	}

	private static void testSearch() throws SQLException {
		String ip = getRandIp();
		String[] array = search(ip);
		if (array == null || array.length == 0)
			System.out.println("ip=" + ip + ",返回结果:null,null");
		if (array.length == 1)
			System.out.println("ip=" + ip + ",返回结果:" + array[0] + ",null");
		if (array.length == 2)
			System.out.println("ip=" + ip + ",返回结果:" + array[0] + ","
					+ array[1]);
	}

	/**
	 * 搜索ip地址所在城市的方法
	 * @param ip
	 * @return
	 * @throws SQLException
	 */
	private static String[] search(String ip) throws SQLException {
		long ipLong = parseLong(ip);
		String sql = "select * from ip_address where min_ip<=? order by min_ip desc LIMIT 1;";
		PreparedStatement ps = conn.prepareStatement(sql);
		ps.setLong(1, ipLong);
		ResultSet rs = ps.executeQuery();
		Map<String, Object> minMap = null;
		if (rs.next()) {
			minMap = new HashMap<String, Object>();
			minMap.put("min_ip", rs.getLong("min_ip"));
			minMap.put("max_ip", rs.getLong("max_ip"));
			minMap.put("city", rs.getString("city"));
			minMap.put("line", rs.getString("line"));
		}
		rs.close();
		ps.close();

		sql = "select * from ip_address where max_ip<=? order by max_ip desc LIMIT 1;";
		ps = conn.prepareStatement(sql);
		ps.setLong(1, ipLong);
		rs = ps.executeQuery();
		Map<String, Object> maxMap = null;
		if (rs.next()) {
			maxMap = new HashMap<String, Object>();
			maxMap.put("min_ip", rs.getLong("min_ip"));
			maxMap.put("max_ip", rs.getLong("max_ip"));
			maxMap.put("city", rs.getString("city"));
			maxMap.put("line", rs.getString("line"));
		}
		rs.close();
		ps.close();

		if (minMap == null && maxMap == null)
			return null;
		else if (minMap == null && maxMap != null)
			return new String[] { getProperty(maxMap, "city"),
					getProperty(maxMap, "line") };
		else if (minMap != null && maxMap == null)
			return new String[] { getProperty(minMap, "city"),
					getProperty(minMap, "line") };
		else if (minMap != null && maxMap != null) {
			long min_ip = Long.parseLong(minMap.get("min_ip").toString());
			long max_ip = Long.parseLong(maxMap.get("max_ip").toString());
			if (Math.abs(min_ip - ipLong) <= Math.abs(max_ip - ipLong))
				return new String[] { getProperty(minMap, "city"),
						getProperty(minMap, "line") };
			else
				return new String[] { getProperty(maxMap, "city"),
						getProperty(maxMap, "line") };
		} else
			return null;
	}

	private static String getProperty(Map<String, Object> map, String key) {
		Object value = map.get(key);
		return value == null ? null : value.toString();
	}

	private static String getRandIp() {
		Random random = new Random();
		return random.nextInt(256) + "." + random.nextInt(256) + "."
				+ random.nextInt(256) + "." + random.nextInt(256);
	}

	private static long parseLong(String ipStr) {
		String[] ipArray = ipStr.split("\\.");
		long sum = 0;
		final long[] weights = { 256 * 256 * 256, 256 * 256, 256, 1 };
		for (int i = 0; i < 4; i++) {
			if (ipArray[i].trim().length() == 0)
				return -1;
			if (!ipArray[i].matches("^\\d+$"))
				return -1;
			int n = Integer.parseInt(ipArray[i]);
			if (n > 255)
				n = 255;
			if (n < 0)
				n = 0;
			sum += weights[i] * n;
		}
		return sum;
	}

}

分享到:
评论
1 楼 doxw 2012-03-28  
谢谢分享

相关推荐

    ip显示地址(完全原创)

    它通过对接大规模的IP地址数据库,实现了用户输入IP地址后即时展示对应地理位置的功能。开发这样的工具需要掌握网络协议、数据库操作、地理信息系统(GIS)等相关知识,同时也需要关注数据隐私和合规性问题,因为...

    纯真ip查询系统 ASP版-ASP源码.zip

    "纯真IP查询系统"可能利用了一个包含IP地址数据的数据库,比如“纯真IP库”,这个库通常包含了全球IP地址的分配信息,包括国家、地区、城市等详细地理信息。 在实际应用中,当用户访问网站时,系统会捕获用户的IP...

    原创易语言连接数据库,实现增、删、改、查数据库,一键导入数据库源码

    在提供的"数据库连接及部分操作.e"文件中,包含了实现这些功能的具体代码。 连接数据库的过程通常包括以下几个步骤: 1. 导入必要的模块:在易语言中,我们需要导入包含数据库连接功能的模块,如"精易模块"。 2. ...

    最新NET 读取纯真IP数据库代码(C#)

    QQWryLocation IP地址信息的实体类 本代码包下载分是 5 分,有点高了,呵呵~~~ 但保证绝对是作者原创作品,物有所值,绝对不是从网上随便找点东西骗分哦,请支持。 如果代码中存在 BUG 请反馈于 panxiaofeng@126....

    [工具查询]原创php+mysql动态签名程序_iplogo.zip

    【标题】:“[工具查询]原创php+mysql动态签名程序_iplogo.zip”指的是一个使用PHP编程语言和MySQL数据库系统开发的动态签名生成程序。这个程序可能用于网站或应用程序,为用户提供自定义或随机生成的签名图像,从而...

    实验机房管理系统(包括自己的想法,用C#写的,数据库是Access)

    【IP操作】标签暗示系统可能包含网络通信功能,比如自动获取或分配IP地址,以便于管理和监控实验机房中的设备。这可能是通过C#的System.Net命名空间实现的,它提供了一系列的类和方法来处理网络连接和数据传输。 ...

    mysql 学习笔记 绝对原创 包含工作中常用的语句 存储过程 函数 触发器等

    MySQL是世界上最受欢迎的开源数据库系统之一,以其快速、可靠和易于使用的特点著称。这篇学习笔记将深入探讨MySQL的基础知识,包括数据类型、操作命令、存储过程和触发器等核心概念。 首先,让我们来看看MySQL的...

    【原创】在大牛的肩膀上,如何入侵锐捷服务器

    3. **具体IP地址**:文中还提到了具体的IP地址,例如RADIUS服务器的地址172.16.2.253和SQL数据库服务器的地址172.16.2.252。这些信息表明文中描述了一个特定的网络环境配置。 ### 技术细节探讨 - **RADIUS + SQL...

    vc++ 应用源码包_5

    ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...

    超级简单快捷爬虫代码python

    8. **反爬策略应对**:许多网站有反爬机制,如验证码、IP封锁等,此时可能需要使用更复杂的技术如Selenium(模拟浏览器行为)或更换IP地址。 9. **Douban MovieReview**:从压缩包的文件名推测,此代码可能涉及抓取...

    免费卡盟平台源码

    5. **userip.asp**:可能涉及到用户IP的记录和管理,用于安全控制,如防止恶意攻击或监测异常登录。 6. **payonline.asp**:在线支付相关的代码,用于处理支付接口的调用和支付状态的确认,确保交易的顺利进行。 7...

    data-export.rar

    主机连接信息通常包括服务器的IP地址、端口号,以及连接协议,如TCP/IP。同时,用户还需要提供账号和密码,这是数据库访问权限控制的一部分,确保只有授权的用户能够访问和操作数据。 描述中提到的“选择数据库”...

    vc++ 开发实例源码包

    ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...

    vc++ 应用源码包_1

    ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...

    thinkphp学习资料

    20. IP地址定位:学习如何使用IP地址进行用户定位,收集用户信息。 21. 行为:深入理解框架的行为扩展机制,提高代码的复用性。 总之,ThinkPHP3.1快速入门教程系列为初学者提供了一条从基础到高级特性的学习路径,...

    vc++ 应用源码包_2

    ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...

    vc++ 应用源码包_6

    ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...

    【原创】] Bluecms 0day 大集合.docx

    该函数用于获取客户端IP地址,但由于`client_ip`和`x_forwarded_for`字段均可被伪造,攻击者可以通过伪造这些字段来进行SQL注入攻击。 **利用方式**: - **步骤一**:首先伪造`client_ip`或`x_forwarded_for`字段,...

    vc++ 应用源码包_3

    ip地址扫描,发送邮箱。 ResizableLib 测试开源界面库Resizable。 RsPicture 自定义了一个图片库,然后引用测试。 SimplePlayer 简单的媒体播放源码。 Skin_Combo_Box_demo 自绘Combox控件的实例。 SkinList_...

Global site tag (gtag.js) - Google Analytics