问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

11=口十IO=囗十囗=囗十囗=囗一|

发布网友 发布时间:2022-04-09 18:28

我来回答

2个回答

懂视网 时间:2022-04-09 22:49

# _*_ coding:utf-8 _*_ import select import socket sock = socket.socket() sock.setblocking(False) sock.bind((‘127.0.0.1‘,8888)) sock.listen(5) def process_data(client): data = bytes() while True: try: chunk = client.recv(1024) except Exception as e: chunk = None if not chunk: break data += chunk data_str = str(data,encoding=‘utf-8‘) header,body = data_str.split(‘ ‘, 1) header_list = header.split(‘ ‘) header_dick = {} for line in header_list: value = line.split(":",1) if len(value) == 2: k,v = value header_dick[k] = v else: header_dick[‘method‘],header_dick[‘url‘],header_dick[‘protocal‘] = line.split(‘ ‘) return header_dick,body inputs = [sock,] while True: rlist,wlist,elist = select.select(inputs,[],[],0.05) for client in rlist: if client == sock: conn,addr = client.accept() conn.setblocking(False) inputs.append(conn) else: header_dicy,body = process_data(client) print(header_dicy) request_url = header_dicy[‘url‘] client.sendall(request_url.encode(‘utf-8‘)) inputs.remove(client) client.close() http服务-函数
技术分享 
import select
import socket

class Http_server(object):
 def __init__(self,routers):
 self.routers = routers

 def process_data(self,conn):
 data = bytes()
 while True:
  try:
  chunk = conn.recv(1024)
  except Exception as e:
  chunk = None
  if not chunk:
  break
  data = data + chunk
 data_str = str(data, encoding=‘utf-8‘)
 header, body = data_str.split(‘

‘, 1)
 header_list = header.split(‘
‘)

 header_dict = {}
 for line in header_list:
  value = line.split(‘:‘, 1)
  if len(value) == 2:
  k, v = value
  header_dict[k] = v
  else:
  header_dict[‘method‘], header_dict[‘url‘], header_dict[‘protcol‘] = line.split(‘ ‘)
 return header_dict, body

 def run(self,host=‘127.0.0.1‘,port=8888):
 sock = socket.socket()
 # sock.setblocking(False)
 sock.bind((host,port,))
 sock.listen(5)
 # while True:
 # conn,addr = sock.accept() # 不在hang主,直接报错
 # conn.setblocking(False)
 # conn.recv(100)  # 不在hang主,直接报错
 inputs = [sock,]
 while True:
  # [1,]
  rList,wList,eList = select.select(inputs,[],[],0.5)
  for client in rList:
  # 建立连接
  if client == sock:
   conn,addr = client.accept()
   # conn.setblocking(False)
   inputs.append(conn)
  else:
   header_dict,body = self.process_data(client)
   # client.recv(1024)
   request_url = header_dict[‘url‘]
   # routers = [
   # (‘/index.html‘, f1),
   # (‘/login.html‘, f2)
   # ]
   func_name = None
   for item in self.routers:
   if item[0] == request_url:
    func_name = item[1]
    break
   if not func_name:
   client.sendall(b‘404‘)
   else:
   result = func_name(header_dict,body)
   client.sendall(result.encode(‘utf-8‘))
   inputs.remove(client)
   client.close()
http服务-类
技术分享
import Http

def f1(header_dict,body):
 # ... Http...
 # .....
 return ‘ffffff‘

def f2(header_dict,body):
 return ‘aaaaaaaaaa‘

routers = [
 (‘/index.html‘,f1),
 (‘/login.html‘,f2)
]

obj = Http.Http_server(routers)
obj.run()
http服务-类
 
 
  参考博客:http://www.cnblogs.com/wupeiqi/p/6536518.html
- socket客户端(爬虫)
利用一个线程,同时发送n个请求(异步非阻塞模块)

url_list [
http://www.baidu.com,
http://www.baidu1.com,
http://www.baidu2.com,
http://www.baidu3.com,

]
技术分享 
import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):
 def get(self):
 self.write("Hello, world")


application = tornado.web.Application([
 (r"/index.html", MainHandler),
])

if __name__ == "__main__":
 application.listen(8889)
 tornado.ioloop.IOLoop.instance().start()
程序员使用框架

a. 循环列表,为每一个URL生成Socket对象
b. 每一个socket对象,向远程发送链接请求
connect: 阻塞
c. 如果连接:
发送数据:遵循格式
d. 获取响应内容
e. 关闭

注意:可读和可写状态
技术分享 
import tornado.ioloop
import tornado.web
import socket
import select
sock = socket.socket()
sock.fileno()
class Foo(object):
 def __init__(self,sock,callback,url,host):
 self.sock = sock
 self.callback = callback
 self.url = url
 self.host = host

 def fileno(self):
 return self.sock.fileno()

class NbIO(object):

 def __init__(self):
 self.fds = []
 self.connections = []

 def connect(self,url_list):
 for item in url_list:
  conn = socket.socket()
  conn.setblocking(False)
  # 1. 发送链接请求
  try:
  conn.connect((item[‘host‘],80))
  except BlockingIOError as e:
  pass
  obj = Foo(conn,item[‘callback‘],item[‘url‘],item[‘host‘])
  self.fds.append(obj)
  self.connections.append(obj)

 def send(self):
 while True:
  # wList,有对象;当前socket已经创建链接
  try:
  if len(self.fds) == 0:
   return
  rList,wList,eList = select.select(self.fds,self.connections,[],0.5)
  # 【1,11】
  for obj in rList:
   # 4.有数据响应回来了
   conn = obj.sock
   data = bytes()
   while True:
   try:
    d = conn.recv(1024)
    data = data + d
   except BlockingIOError as e:
    d = None
   if not d:
    break
   # print(data)
   obj.callback(data) # 自定义操作 f1 f2
   self.fds.remove(obj)
   # print(len(self.fds),len(self.connections))
   # 执行当前请求 函数:f1 f2
  # 【1,2,3,】
  for obj in wList:
   # 2.已经连接上远程
   conn = obj.sock
   # 3. 发送数据
   # HTTP/1.0
Host: %s


   template = "GET %s HTTP/1.1
Host: %s

" %(obj.url,obj.host,)

   # template = "POST %s HTTP/1.1
Host: 127.0.0.1:8888

k1=v1&k2=v2" %(obj.url,)
   conn.sendall(template.encode(‘utf-8‘))
   self.connections.remove(obj)
  except OSError as e:
  pass # 因为win下的select里的列表空了之后会报错,报错就忽视它

class MainHandler(tornado.web.RequestHandler):
 def get(self):
 self.write("Hello, world")


application = tornado.web.Application([
 (r"/index.html", MainHandler),
])

if __name__ == "__main__":
 application.listen(8889)
 tornado.ioloop.IOLoop.instance().start()
异步IO模块

参考博客:http://www.cnblogs.com/wupeiqi/articles/6229292.html

产出:
1. setblockint(False)
2. select监听其他对象: def fileno():...
3. gevent,twisted,asycio ---> 单线程并发发送Http请求

2. Paramiko
参考博客:http://www.cnblogs.com/wupeiqi/articles/5095821.html
- 是一个模块,socket,SSH
- Python代码,实现远程服务器操作

功能:
a. 使用用户名密码:
- 命令 SSHClient -> Transport
- 文件 Transport
b. 使用用户名秘钥:
- 命令 SSHClient -> Transport
- 路径,也支持字符串形式
- 文件 Transport

====> SSH帮助类 <====
c.
执行创建session # 堡垒机 Bug
技术分享 
import paramiko

# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname=‘192.168.12.59‘, port=22, username=‘root‘, password=‘sungaohui1990‘)

# 执行命令
stdin, stdout, stderr = ssh.exec_command(‘ls /‘)
# 获取命令结果
result = stdout.read()
print(result)

# 关闭连接
ssh.close()
paramiko使用

技术分享
import paramiko

class SshHelper(object):

 def __init__(self,host,port,username,pwd):
 self.host = host
 self.port = port
 self.username = username
 self.pwd = pwd
 self.transport = None

 def connect(self):
 transport = paramiko.Transport((self.host, self.port,))
 transport.connect(username=self.username, password=self.pwd)
 self.transport = transport

 def upload(self,local,target):
 sftp = paramiko.SFTPClient.from_transport(self.transport)
 # 将location.py 上传至服务器 /tmp/test.py
 sftp.put(local, target)
 # 将remove_path 下载到本地 local_path
 # sftp.get(‘remove_path‘, ‘local_path‘)

 def cmd(self,shell):
 ssh = paramiko.SSHClient()
 ssh._transport = self.transport
 stdin, stdout, stderr = ssh.exec_command(shell)
 stdout.read()

 def close(self):
 self.transport.close()

if __name__ == ‘__main__‘:

 obj = SshHelper(‘10.0.0.61‘,‘22‘,‘root‘,‘123456‘)
 obj.connect()
 obj.close()
paramikoHelper
 产出:
- 链接远程,操作:命令,文件


3. MySQL
- 什么是MySQL
服务端:
a.socket服务端运行,监听:IP和端口
b.获取客户端发送的数据:
c.解析
d.去文件中做操作
客户端:
a.socket客户端:基于各种语言的客户端
b.验证
c.发送命令(学习规则SQL语句)
- 安装
服务端:
客户端:

- 基本使用:
a. 申请
用户:

授权:
用户名,数据库(文件夹),表(文件),增删改查,IP

b. 连接

 mysql -u root -h c1.com -p
 asdfasdf


 mysql -u wupeiqi -h 192.168.12.111 -p 123


c. 规则
文件夹(数据库):
 create database db1 default charset utf8;
 drop database db1;

 show databases;
 use db1;


文件(表):

 show tables;


 create table tb1(
 id int not null auto_increment primary key,
 name char(20) null default 1,
 age int not null)engine=innodb default charset utf8;


 # 增
 insert into tb1(name,age) values(‘alex‘,18);
 # 删
 delete from tb1 where id>1;
 # 改
 update tb1 set age=168 where id=2;
 # 查
 select * from tb1;
 

============================================================

外键:foreign key 一对多
 create table deparment(
 id int not null auto_increment primary key,
 title char(32) null
 )

 create table person(
 id int not null auto_increment primary key,
 username char(32) null ,
 age int not null,
 deparment_id int not null,
 constraint fk_cc foreign key (deparment_id) references deparment(id)
 )


双向的外键: 多对多
 create table deparment(
 id int not null auto_increment primary key,
 title char(32) null
 )

 create table host(
 id int not null auto_increment primary key,
 ip char(32) null,
 port char(32) null
 )

 create table de_2_host(
 id int not null auto_increment primary key,
 did int not null,
 hid int not null,
 constraint fk_did_deparment foreign key (did) references deparment(id),
 constraint fk_hid_host foreign key (hid) references host(id)
 )


连表:
 select * from person;

 select * from person
 left join deparment on person.deparment_id = deparment.id
 # 
 1 alex 18 1 1 咨询
 2 oldboy 68 3 3 基础


 select id from deparment where title = "基础"

 select hostid from host_deparment where deparment_id=1111

 select * from host id in (1,2,3)

 ####### 




4. pymysql
pip3 install pymysql

# 内部socket
技术分享 
import pymysql

conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘‘, db=‘host_manage‘)
# cursor = conn.cursor()
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 执行SQL,并返回受影响行数# 被搞...
effect_row = cursor.execute("select * from user",)
conn.commit()
ret = cursor.fetchall()
# ret = cursor.fetchmany(3)
# ret = cursor.fetchone()
# print(ret)
# ret = cursor.fetchone()
# print(ret)
cursor.close()
conn.close()

print(ret)
pymysql使用


技术分享 
 import pymysql

 # 创建连接
 conn = pymysql.connect(host=‘127.0.0.1‘, port=3306, user=‘root‘, passwd=‘123‘, db=‘t1‘)
 # 创建游标
 cursor = conn.cursor()

 username = input(‘请输入用户名:‘)
 pwd = input(‘请输入密码:‘)

 # 执行SQL,并返回受影响行数
 #effect_row = cursor.execute("select * from userinfo where username=%s and pwd = %s", (username,pwd,))

 # root or 1==1 -- 
 # adfasdf
 # sql = "select * from userinfo where username=%s and pwd = %s" %(username,pwd,)
 # select * from userinfo where username=root or 1==1 -- and pwd = %s
 #effect_row = cursor.execute(sql)

 # 提交,不然无法保存新建或者修改的数据
 conn.commit()

 # 关闭游标
 cursor.close()
 # 关闭连接
 conn.close()
pymysql使用

11-IO多路复用-paramiko-MySQL

标签:eve   线程并发   sql   loop   byte   tde   利用   body   __init__   

热心网友 时间:2022-04-09 19:57

11=1+10=2+9=3+8=12-1
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
聊斋故事:色蟒 车大梁在哪个位置? 我用一跟IDE线接了两个移动硬盘?出现了问题 电脑可以接两个移动硬盘吗一台电脑如何连接两个硬盘 电脑硬盘作为移动硬盘旧电脑硬盘如何变成移动硬盘 怎么给电脑加装一个移动硬盘请问怎么给台式机安装硬盘 电脑硬盘改移动硬盘线如何将电脑里的硬盘改装成移动硬盘 DP扩展分配器哪一家更靠谱呀? 你好,我的联想笔记本黑屏,背光灯是亮的,无显示,外接显示器正常,排线接 ... 笔记本显示屏黑屏但有背光怎么办? 电脑显示屏两边显示不到边是怎么回事?分辨率也调好了,还是不行 砌体填充墙,十字墙、丁字墙、转角处设置构造柱,依据是什么?在哪本规范上有说明? 钢筋混凝土框架结构中砌体填充墙的抗震构造要求有哪些 框架结构或剪力墙结构的填充墙长几米需要设置构造柱? 框架结构中填充墙设置的原则?规范是什么? 规范里规定的构造柱的设置是间隔多少距离一个 如果设计图纸没有详细规定的话 建筑填充墙几米设构造柱 建筑施工中填充墙加设构造柱的规范规定 程控交换机的突出优点是什么? 相对于路由器,交换机有什么优点 和老公心中有隔阂了,还能贴近吗 交换机是从哪个层次上实现了网络的互连,与网桥相比交换机具有哪些优点 当夫妻之间有隔阂时,该怎么办? 和老公产生分歧隔阂了,怎么办 感觉我和我老公之间的隔阂很深,现在我心情很烦躁,他跟没事人一样,都有种不想和他过了, 交换机是从哪个层次上实现了网络的互联?与集线器相比,交换机有哪些优点? 婚后发现和老公性格不合怎么办? 下载哪一种收音机收听的时候可以不用流量 感觉有点心寒,与老公有隔阂,怎么办? 发现和老公之间好像有隔阂了,怎么办 如何设置桌面动态屏幕保护程序? 微信电话挂断对方会显示什么对方挂断聊天结束,然后对方显示被其他应用中断是什么情况? 2000以内电脑配置怎么配啊,另外还要个声卡,和个鸡架大概要多少钱?电脑主机的价格都配上谢谢了。。。。 自己想买个便宜的声卡【声卡100左右就行】!还有2000元组装个电脑主机!【显卡电源自己有了】 电脑主机这个配置卖多少钱合适? 网上K歌用的麦要多钱.声卡的价位有多少? 电脑配置问题,声卡问题。 我要买组装电脑加声卡设备,整套(品牌、价位、建议),真心求教行家_百度... 配一台电脑主机大概多少钱 2010配置的电脑主机能卖多少钱? 这种电脑主机值多少钱 哪些事物有默默的奉献精神的品质? 赞美“默默无闻,无私奉献的精神”有哪些诗句? 请问如何学习嵌入式linux?实践之前应作些什么样的准备 小草无私奉献的精神有哪些? 只要无私奉献的精神的人就是一个怎样的人? 嵌入式系统Linux内核开发实战指南的前言(序) 什么职业是默默无闻,无私奉献的 他大公无私默默奉献的精神是值得我们学习的榜样修改病句? 嵌入式系统Linux内核开发实战指南的介绍