/*
* Created on 2005-8-29
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.yeqiangwei.club.ip;
import org.apache.log4j.Logger;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.thesaurus.AnalyzerUtils;
import com.yeqiangwei.club.service.ServiceLocator;
import com.yeqiangwei.club.service.ServiceWrapper;
import com.yeqiangwei.club.service.search.AnalyzerFactory;
import com.yeqiangwei.club.service.util.BasicInfoService;
import com.yeqiangwei.io.File;
import com.yeqiangwei.util.Validator;
/*
* LumaQQ - Java QQ Client
*
* Copyright (C) 2004 luma <stubma@163.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteOrder;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
/**
* <pre>
* 用来读取QQwry.dat文件,以根据ip获得好友位置,QQwry.dat的格式是
* 一. 文件头,共8字节
* 1. 第一个起始IP的绝对偏移, 4字节
* 2. 最后一个起始IP的绝对偏移, 4字节
* 二. "结束地址/国家/区域"记录区
* 四字节ip地址后跟的每一条记录分成两个部分
* 1. 国家记录
* 2. 地区记录
* 但是地区记录是不一定有的。而且国家记录和地区记录都有两种形式
* 1. 以0结束的字符串
* 2. 4个字节,一个字节可能为0x1或0x2
* a. 为0x1时,表示在绝对偏移后还跟着一个区域的记录,注意是绝对偏移之后,而不是这四个字节之后
* b. 为0x2时,表示在绝对偏移后没有区域记录
* 不管为0x1还是0x2,后三个字节都是实际国家名的文件内绝对偏移
* 如果是地区记录,0x1和0x2的含义不明,但是如果出现这两个字节,也肯定是跟着3个字节偏移,如果不是
* 则为0结尾字符串
* 三. "起始地址/结束地址偏移"记录区
* 1. 每条记录7字节,按照起始地址从小到大排列
* a. 起始IP地址,4字节
* b. 结束ip地址的绝对偏移,3字节
*
* 注意,这个文件里的ip地址和所有的偏移量均采用little-endian格式,而java是采用
* big-endian格式的,要注意转换
* </pre>
*
* @author 马若劼
*/
public class IPSeeker {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(IPSeeker.class);
/**
* <pre>
* 用来封装ip相关信息,目前只有两个字段,ip所在的国家和地区
* </pre>
*
* @author 马若劼
*/
private class IPLocation {
/**
* Logger for this class
*/
private final Logger logger = Logger.getLogger(IPLocation.class);
public String country;
public String area;
public IPLocation() {
country = area = "";
}
public IPLocation getCopy() {
if(logger.isDebugEnabled())
{
logger.debug("getCopy() - start");
}
IPLocation ret = new IPLocation();
ret.country = country;
ret.area = area;
if(logger.isDebugEnabled())
{
logger.debug("getCopy() - end");
}
return ret;
}
}
private static String IP_FILE = null;
static{
if(IP_FILE==null){
IP_FILE = getBasicService().findOnly().getSitePath()+"WEB-INF"+File.separator+"index"+File.separator+"QQWry.Dat";
}
}
public static BasicInfoService getBasicService() {
return ServiceWrapper.<BasicInfoService>getSingletonInstance(ServiceLocator.BASICINFO);
}
// 一些固定常量,比如记录长度等等
private static final int IP_RECORD_LENGTH = 7;
private static final byte AREA_FOLLOWED = 0x01;
private static final byte NO_AREA = 0x2;
// 用来做为cache,查询一个ip时首先查看cache,以减少不必要的重复查找
private Hashtable<String,IPLocation> ipCache;
// 随机文件访问类
private RandomAccessFile ipFile;
// 内存映射文件
private MappedByteBuffer mbb;
// 单一模式实例
private static IPSeeker instance = new IPSeeker();
// 起始地区的开始和结束的绝对偏移
private long ipBegin, ipEnd;
// 为提高效率而采用的临时变量
private IPLocation loc;
private byte[] buf;
private byte[] b4;
private byte[] b3;
/**
* 私有构造函数
*/
private IPSeeker() {
ipCache = new Hashtable<String,IPLocation>();
loc = new IPLocation();
buf = new byte[100];
b4 = new byte[4];
b3 = new byte[3];
try {
if(logger.isDebugEnabled())
{
logger.debug("IPSeeker() - " + IP_FILE);
}
ipFile = new RandomAccessFile(IP_FILE, "r");
} catch (FileNotFoundException e) {
logger.error("IPSeeker()", e);
if(logger.isDebugEnabled())
{
logger.debug("IPSeeker() - "
+ IPSeeker.class.getResource("/QQWry.dat").toString());
}
if(logger.isDebugEnabled())
{
logger.debug("IPSeeker() - " + IP_FILE);
}
if(logger.isDebugEnabled())
{
logger.debug("IPSeeker() - IP地址信息文件没有找到,IP显示功能将无法使用");
}
ipFile = null;
}
// 如果打开文件成功,读取文件头信息
if(ipFile != null) {
try {
ipBegin = readLong4(0);
ipEnd = readLong4(4);
if(ipBegin == -1 || ipEnd == -1) {
ipFile.close();
ipFile = null;
}
} catch (IOException e) {
logger.error("IPSeeker()", e);
if(logger.isDebugEnabled())
{
logger.debug("IPSeeker() - IP地址信息文件格式有错误,IP显示功能将无法使用");
}
ipFile = null;
}
}
}
/**
* @return 单一实例
*/
public static IPSeeker getInstance() {
if(logger.isDebugEnabled())
{
logger.debug("getInstance() - start");
}
if(logger.isDebugEnabled())
{
logger.debug("getInstance() - end");
}
return instance;
}
/**
* 给定一个地点的不完全名字,得到一系列包含s子串的IP范围记录
* @param s 地点子串
* @return 包含IPEntry类型的List
*/
public List<IPEntry> getIPEntriesDebug(String s) {
if(logger.isDebugEnabled())
{
logger.debug("getIPEntriesDebug(String) - start");
}
List<IPEntry> ret = new ArrayList<IPEntry>();
long endOffset = ipEnd + 4;
for(long offset = ipBegin + 4; offset <= endOffset; offset += IP_RECORD_LENGTH) {
// 读取结束IP偏移
long temp = readLong3(offset);
// 如果temp不等于-1,读取IP的地点信息
if(temp != -1) {
IPLocation loc = getIPLocation(temp);
// 判断是否这个地点里面包含了s子串,如果包含了,添加这个记录到List中,如果没有,继续
if(loc.country.indexOf(s) != -1 || loc.area.indexOf(s) != -1) {
IPEntry entry = new IPEntry();
entry.country = loc.country;
entry.area = loc.area;
// 得到起始IP
readIP(offset - 4, b4);
entry.beginIp = IPUtils.getIpStringFromBytes(b4);
没有合适的资源?快使用搜索试试~ 我知道了~
社区论坛YeQiangWeiClub v1.0 M2 源码版
共518个文件
java:476个
xml:40个
txt:1个
5星 · 超过95%的资源 需积分: 9 15 下载量 9 浏览量
2008-11-27
10:27:19
上传
评论 1
收藏 478KB RAR 举报
温馨提示
社区文章采用的是平板、树形自由选择的两种展示方式,社区整体布局采用左右分帧,这样的结构更... 软件类别:论坛社区 运行环境:JSP+SQLServer 授权方式:免费版
资源详情
资源评论
资源推荐
收起资源包目录
社区论坛YeQiangWeiClub v1.0 M2 源码版 (518个子文件)
IPSeeker.java 28KB
ViewCoder.java 22KB
ForumJsp.java 21KB
TopicServiceImpl.java 20KB
UserServiceImpl.java 17KB
UserAction.java 17KB
TopicImpl.java 16KB
UserImpl.java 16KB
ReplyServiceImpl.java 15KB
TopicProxy.java 15KB
UserImpl.java 15KB
UserPower.java 13KB
TopicImpl.java 12KB
FriendServiceImpl.java 12KB
AdminServlet.java 12KB
UserJsp.java 12KB
LinkTag.java 11KB
TopicTag.java 11KB
MessageProxy.java 10KB
FileUploadBean.java 10KB
ReplyProxy.java 10KB
UBBDecoder.java 10KB
FileUploadServlet.java 10KB
EnCoder.java 10KB
ForumServiceImpl.java 10KB
FavoriteForumServiceImpl.java 9KB
MessageServiceImpl.java 9KB
BasicInfo.java 9KB
GroupServiceImpl.java 9KB
TopicView.java 9KB
TopicAction.java 9KB
BasicInfoModel.java 9KB
BasicInfoForm.java 9KB
IReleaseService.java 8KB
UserProxy.java 8KB
ForumResults.java 8KB
NoAllowedCharServiceImpl.java 8KB
GroupOfForumServiceImpl.java 8KB
MessageJsp.java 8KB
MessageTakeImpl.java 8KB
AdminAction.java 8KB
ReplyAction.java 7KB
UserView.java 7KB
ReplyView.java 7KB
User.java 7KB
FriendImpl.java 7KB
CountServiceImpl.java 7KB
BasicInfoXml.java 7KB
LanguageUtils.java 7KB
PhotoUploadServlet.java 7KB
HibernateFacade.java 7KB
HibernateUserFacade.java 7KB
AEmailSender.java 7KB
UserModel.java 7KB
AdminServiceImpl.java 7KB
RuleServiceImpl.java 7KB
ReplyImpl.java 7KB
MessageSendImpl.java 7KB
TopicModel.java 6KB
ReContentImpl.java 6KB
UrlUtils.java 6KB
AdvancedTagHandler.java 6KB
Topic.java 6KB
UserAjax.java 6KB
AProfileForm.java 6KB
MessageBlacklistServiceImpl.java 6KB
UserLogin.java 6KB
UserSettingsServiceImpl.java 6KB
ForumAction.java 5KB
MessageBlacklistImpl.java 5KB
GroupImpl.java 5KB
ReplyModel.java 5KB
BasicInfoServiceImpl.java 5KB
CountersImpl.java 5KB
ForumView.java 5KB
TopicAjax.java 5KB
AdServiceImpl.java 5KB
GroupOfForumImpl.java 5KB
OnlineServiceImpl.java 5KB
ContentImpl.java 5KB
SearchJsp.java 5KB
ForumModel.java 5KB
TopicPostForm.java 5KB
Utils.java 5KB
ManageLogImpl.java 5KB
ConnectionCfg.java 5KB
PUserImpl.java 5KB
UserRegisterForm.java 5KB
ReleaseJsp.java 5KB
EmailServiceImpl.java 5KB
RegisterServiceImpl.java 5KB
FriendLabelServiceImpl.java 5KB
RoleServiceImpl.java 5KB
ReplyUsersImpl.java 5KB
FavoriteForumImpl.java 5KB
RegisterImpl.java 4KB
FileUploadModel.java 4KB
ManageLogServiceImpl.java 4KB
Commend.java 4KB
ServiceLocator.java 4KB
共 518 条
- 1
- 2
- 3
- 4
- 5
- 6
lms123328234
- 粉丝: 15
- 资源: 97
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论1