介绍
这期内容当中小编将会给大家带来有关利用Python怎么实现一个SQLite代理服务器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
<强>服务程序:强>
# # #,服务器程序,接收代理服务器转发来的SQL指令,并返回结果 # import sqlite3 import 套接字 import 结构 def getData (sql): ,& # 39;& # 39;& # 39;通过给定的SQL 选择语句返回结果& # 39;& # 39;& # 39; ,with sqlite3.connect (" # 39; database.db& # 39;), as 康涅狄格州: 时间=cur 才能;conn.cursor () cur.execute才能(sql) 时间=result 才能;cur.fetchall () return 结果 def doSql (sql): ,& # 39;& # 39;& # 39;适用于删除/更新/INSERT 到语句,返回影响的记录条数& # 39;& # 39;& # 39; ,with sqlite3.connect (" # 39; database.db& # 39;), as 康涅狄格州: 时间=cur 才能;conn.cursor () 时间=result 才能;cur.execute (sql) return result.rowcount #,创建插座对象,默认使用IPV4 + TCP 时间=sockServer socket.socket () sockServer.bind ((& # 39; & # 39;,, 3030)) sockServer.listen (1) while 真正的: ,#接收客户端连接 ,试一试: ,,康涅狄格州,addr =, sockServer.accept () ,除了: ,继续 ,=,,sql  conn.recv (1024) .decode (& # 39; gbk # 39;) .lower () , ,if sql.startswith((& # 39;更新# 39;,& # 39;删除# 39;,& # 39;插入# 39;)): 尝试才能: ,,#,首先发送要发送的字节总数量 ,,#,然后再发送真实数据 ,,result =, str (doSql (sql) .encode (& # 39; gbk # 39;) ,,conn.send (struct.pack(& # 39;我# 39;,,len(结果))) ,,conn.send(结果) 除了才能: ,,message =, b # 39;错误# 39; ,,conn.send (struct.pack(& # 39;我# 39;,,len(消息))) ,,conn.send(消息) ,elif sql.startswith(& # 39;选择# 39;): 尝试才能: ,,result =, str (getData (sql)) .encode (& # 39; gbk # 39;) ,,conn.send (struct.pack(& # 39;我# 39;,,len(结果))) ,,conn.send(结果) 除了才能: ,,message =, b # 39;错误# 39; ,,conn.send (struct.pack(& # 39;我# 39;,,len(消息))) ,,conn.send(消息)
<强>代理程序:强>
# # #,代理服务器,在SQLite数据库服务器和客户端之间进行指令和数据的转发 #,这样可以把数据库和程序放到两个服务器上进行分离 # # import 套接字 得到threading import 线程 import 结构 时间=sockServer socket.socket () sockServer.bind ((& # 39; & # 39; 5050)) sockServer.listen (50) def 代理(康涅狄格州): ,#接收客户端发来的指令,并进行过滤=,,sql  conn.recv (1024) ,if not  sql.decode (& # 39; gbk # 39;) .startswith((& # 39;选择# 39;,,& # 39;删除# 39;,,& # 39;插入# 39;,& # 39;更新# 39;)): 时间=message 才能;b # 39; not a sql 声明# 39; conn.send才能(struct.pack(& # 39;我# 39;,,len(消息))) conn.send才能(消息) ,返回 ,其他的: 时间=sockClient 才能;socket.socket () #,才能尝试连接服务器 尝试才能: ,,sockClient.connect ((& # 39; 10.2.1.3& # 39;,, 3030)) 除了才能: ,,message =, b # 39; Server not 活着# 39; ,,conn.send (struct.pack(& # 39;我# 39;,,len(消息))) ,,conn.send(消息) ,才能回来 ,, #,才能向服务程序转发SQL语句 sockClient.send才能(sql) #,才能数据量大小,使用sturct序列化一个整数需要4个字节 时间=size 才能;sockClient.recv (4) conn.send才能(大小) size 才能=,struct.unpack(& # 39;我# 39;,,大小)[0] while 才能正确的: ,,if size ==, 0: ,才能打破 ,,elif size 祝辞,4096: ,,,data =, sockClient.recv (4096) ,,,conn.send(数据) ,,,size -=, len(数据) ,,: ,,,data =, sockClient.recv(大小) ,,,conn.send(数据) ,,,size -=, len(数据) sockClient.close才能() ,conn.close () while 真正的: ,康涅狄格州,_ =, sockServer.accept () ,线程(目标=代理,arg游戏=(康涅狄格州)).start ()
<强>模拟客户端程序:强>
# # #,模拟客户端,向SQLite代理服务器发送指令并接收数据 # import sqlite3 import 套接字 import 结构 while 真正的:=,sql 输入(& # 39;输入一个要执行的SQL语句:\ n # 39;) ,#没有输入,进入下一次循环 ,if sql.strip (),==, & # 39; & # 39;: ,继续 , ,#输入离职或辞职,退出客户端 ,if sql 拷贝(& # 39;退出# 39;,,& # 39;退出# 39;): ,打破 ,#建立插座,尝试连接=,,sockClient  socket.socket () ,试一试: sockClient.connect才能((& # 39;10.2.1.3& # 39;,,5050)),, ,除了: 打印才能(& # 39;服务器异常,请检查& # 39;) ,其他的: #,才能发送远程SQL语句 sockClient.send才能(sql.encode (& # 39; gbk # 39;)) 时间=size 才能;sockClient.recv (4) null null null null null null null null null null null null null null null null null null null null null null null null利用Python怎么实现一个SQLite代理服务器