根据网上搜索的资料,稍做改动。
from struct import *
import socket
def Ip2Int(ip):
import struct,socket
return struct.unpack("!I",socket.inet_aton(ip))[0]
def Int2Ip(i):
import socket,struct
return socket.inet_ntoa(struct.pack("!I",i))
class IpLook():
def __init__ ( self, fileName ):
self.dataFile = None;
self.head = None;
self.index = [];
self.start( fileName );
def start( self, fileName ):
self.dataFile = open( fileName, 'rb' );
def end( self ):
if self.dataFile:
self.dataFile.close();
def readHead( self):
self.dataFile.seek( 0 );
str = self.dataFile.read( 8 )
self.head = unpack('II', str);
print "head= %d, %d" % self.head
def readIndex( self ):
bytes = self.head[1]-self.head[0] + 7;
count = bytes/7
print "count = ", count
self.dataFile.seek( self.head[0] )
for start in range( 0, count ):
( ip, of1, of2 ) = unpack( 'IHB', self.dataFile.read( 7 ) )
#print ip, of1, of2
#print pack("!I",ip)
self.index.append( ( ip, (of2<<16) + of1 ) )
#self.index.append( ( unpack( 'I', self.dataFile.read( 4 ) ), \
# unpack( 'I', self.dataFile.read( 3 ) ) ))
#print "index===="
#print self.index
#print "index end"
def findIPPoint( self, ip, start, end ):
if( self.index[ start][0] == ip ):
return ( start, self.index[ start][1] )
if( self.index[ end][0] == ip ):
return ( end, self.index[ end][1] )
if( end - start ==1 ):
return ( start, self.index[ start][1] )
middle = (start+end)/2;
if( ip == self.index[ middle ][0] ):
return ( middle, self.index[ middle ][1] )
if( ip < self.index[ middle ][0] ):
return self.findIPPoint( ip, start, middle );
else:
return self.findIPPoint( ip, middle, end );
def findIPAddress( self, ip ):
index, point = self.findIPPoint( ip, 0, len( self.index)-1 );
if point:
self.dataFile.seek( point )
(ip,) = unpack( 'I', self.dataFile.read( 4 ) )
print "find ip =",socket.inet_ntoa( pack('!I', ip ) )
byte = self.dataFile.read( 1 )
if byte == '\x01' :
countryPoint = self.readPoint()
self.dataFile.seek( countryPoint )
byte = self.dataFile.read( 1 )
if byte == '\x02':
countryPoint2 = self.readPoint()
country = self.readString( countryPoint2 )
self.dataFile.seek( countryPoint + 4 )
else:
country = self.readString( countryPoint )
byte = self.dataFile.read( 1 )
if byte == '\x02' or byte == '\x01':
areaPoint = self.readPoint()
area = self.readString( areaPoint )
else:
area = self.readString( countryPoint + len( country) + 1 )
elif byte == '\x02':
countryPoint = self.readPoint()
country = self.readString( countryPoint )
area = self.readString( point + 8 )
else:
country = self.readString( point + 4 );
area = self.readString( point + 4 + len(country) +1 );
return ( Int2Ip( ip ), country, area)
def readPoint( self ):
(offset1, offset2) = unpack( 'HB', self.dataFile.read( 3 ) )
return (offset2<<16) + offset1
def readString( self, offset = 0 ):
self.dataFile.seek( offset )
buffer = [];
byte = self.dataFile.read(1)
while byte != '\x00':
buffer.append( byte )
byte = self.dataFile.read(1);
return "".join(buffer)#.decode( "UTF-8")
if __name__ == "__main__":
look = IpLook( "QQWry.Dat" );
try:
look.readHead( )
look.readIndex()
print look.findIPAddress( Ip2Int( "4.0.0.0" ) )
#except Exception,e:
# pass
finally:
if look :
look.end();
分享到:
相关推荐
总的来说,实现“java读取纯真ip数据库”的过程包括文件I/O操作、数据解析、数据结构选择以及查询接口的设计。通过学习和参考开源项目,我们可以更好地理解和掌握这一技术,从而在实际项目中实现高效的IP地址管理和...
标题 "LumaQQ及IP查询一(转)" 暗示了这个压缩包可能包含一个与QQ相关的IP...通过对LumaQQ和IP查询工具的深入学习,可以增强对网络通信、数据处理和软件开发的理解,特别是对于那些对IP定位和网络监控感兴趣的IT从业者。
1. **文件读取**:Java的`java.io`包提供了多种读取文件的方法,如`BufferedReader`或`Scanner`。在`IPSeeker`中,可能使用这些类来逐行读取纯真IP数据库的文本文件。 2. **数据解析**:纯真IP数据库的格式通常是每...
XML常用于数据交换和配置文件,这个jar包可能包含了定义lumaQQ数据格式和交互规则的规范。 3. "jql_protocol.jar" 和 "jql_net.jar" - 这两个文件名暗示了与“Java QQ Protocol”(JQL协议)和网络通信有关。"jql_...
LumaQQ源码,lib文件.(说明:这是我付源码的一个lib库.里面有swt的相关类库和部分公用库文件.如果你下载了我上传的LumaQQ源码,那么请下载该类库.以便能正常的运行.) 如有问题.请访问我的空间.查看相关操作.
这个压缩包文件包含了用于安装LumaQQ的脚本,是用户在非标准或者自定义环境中部署LumaQQ的关键步骤。以下是关于LumaQQ安装脚本及相关知识点的详细说明: 1. **LumaQQ介绍**:LumaQQ是由社区开发者维护的一款开源QQ...
1. **网络通信**:LumaQQ.NET 使用.NET Framework的网络编程接口,如Socket类,来实现TCP/IP通信。TCP确保了数据的可靠传输,而Socket则提供了低级别的网络连接控制。开发者可以从中学习到如何建立和管理网络连接,...
LumaQQ的核心在于实现即时通讯功能,这通常涉及到TCP/IP协议、Socket编程和消息序列化等技术。开发者需要理解腾讯的通讯协议,以便正确地建立和维护与服务器的连接,以及发送和接收数据。在Android环境下,考虑到...
【压缩包子文件的文件名称列表】"LumaQQ"表示压缩包内的主要文件或程序可能就叫"LumaQQ",这通常是软件的可执行文件或者安装程序。解压后,用户可以找到并运行这个文件来启动LumaQQ实用版。 知识点详解: 1. **...
在这个压缩包文件中,我们可以找到关于LumaQQ的相关代码和资源。 LumaQQ的主要特性包括: 1. **易用性**:LumaQQ通过简洁的API设计,使得开发者可以快速上手,编写出功能丰富的QQ机器人。 2. **模块化**:项目采用...
其次,库(LIB)文件包含了LumaQQ运行所依赖的各种外部组件。这些库可能包括: 1. **第三方SDK**:例如,可能包含社交登录(如微信、QQ、微博)的SDK,广告平台SDK,地图SDK等。 2. **开源库**:LumaQQ可能使用了...
它使用了TCP/IP协议进行数据传输,这是所有网络应用程序的基础。在源码中,我们可以看到如何构建Socket连接,发送和接收数据包,以及如何处理网络异常。此外,对于QQ特有的消息协议,如TCP心跳包、数据加密解密等,...
描述还提到了“直接替换掉QQWry.dat就可以更新数据”,这表明该项目使用了一个名为QQWry.dat的特定数据文件来存储IP地址和地理位置信息。当需要更新数据库时,用户只需要替换这个文件,无需更改程序本身,体现了设计...
1. **网络通信**:LumaQQ.NET需要实现用户间的实时消息传递,这涉及到网络编程,可能使用TCP/IP协议进行数据传输。为了实现可靠的消息传递,项目可能采用了长连接或者WebSocket技术。 2. **多线程处理**:为了确保...
LumaQQ.Net的源码揭示了如何使用TCP/IP协议进行数据传输,以及如何实现心跳机制、断线重连等功能。 4. **XML序列化与反序列化**:在即时通讯中,消息通常以XML格式进行编码和解码。源码可能包含如何使用.NET ...
2. **即时通讯协议**:LumaQQ作为一款聊天应用,会涉及TCP/IP、HTTP或其他网络通信协议,以及可能的自定义通讯协议。开发者可能会使用XMPP(Extensible Messaging and Presence Protocol)或其他类似协议来实现消息...
4. **其他资源**:除了上述部分,压缩包可能还包含其他辅助文件,如配置文件、测试数据、依赖库等。这些资源对于项目的运行和调试都是必不可少的。 学习LumaQQ,你需要具备一定的编程基础,尤其是与项目相关的语言...
`xml`目录可能包含了其他的XML配置文件或数据文件,这些文件可能与应用程序的设置、用户界面布局或者其他特定功能有关。XML的灵活性使其成为存储和传输配置数据的常用格式。 通过开源,LumaQQ项目提供了一个学习和...
2. "lumaqq" - 这可能是LumaQQ程序的主文件,可能包含源代码、编译后的类文件,或者是可执行文件。如果它是源代码,那么用户可以查看和学习如何实现QQ群发;如果是编译后的文件,用户可以直接运行以使用LumaQQ的功能...