第一步、根据自己的业务需求声明一个继承自Python标准库的模块
# 接收流量类,继承自asyncore.dispatcher,class Receiver(asyncore.dispatcher):
def __init__(self,conn):
asyncore.dispatcher.__init__(self,conn)
self.from_remote_buffer='' # 接收数据的缓冲区
self.to_remote_buffer='' # 发送数据的缓存区
self.sender=None1234567
第二步、根据文档,重写模块中的方法,这些方法有些像生命周期中的事件,你可以通过在这些事件中自定义代码,使得在特定时间点执行特定的代码。
# 接收流量类,继承自asyncore.dispatcher,class Receiver(asyncore.dispatcher):
def __init__(self,conn):
asyncore.dispatcher.__init__(self,conn)
self.from_remote_buffer='' # 接收数据的缓冲区
self.to_remote_buffer='' # 发送数据的缓存区
self.sender=None
# 当活动opener的套接字真正创建连接时被调用。也许发送一个“欢迎”字符串数据,或者比如,初始化一个远程端点的协商协议。
def handle_connect(self):
pass
# 当异步循环检测到一个在信道套接字上的read()调用时会成功被调用。
def handle_read(self):
read = self.recv(BUFSIZE)
self.from_remote_buffer += read # 每次在异步循环中被调用来决定是否一个信道的套接字应该被加到写事件可以发生的列表中。 默认方法简单地返回 True,显然,所有的信道会关注于写事件。
def writable(self):
return (len(self.to_remote_buffer) > 0) # 当异步循环检测到一个可写入的的套接字可以被写入时被调用。常用这个方法为了性能优化实现必要的缓存。
def handle_write(self):
sent = self.send(self.to_remote_buffer)
self.to_remote_buffer = self.to_remote_buffer[sent:] # 当套接字被关闭的时候调用
def handle_close(self):
self.close() if self.sender:
self.sender.close()
B. python标准库中常用的网络相关模块有哪些
1、asynchat、asyncore
asynchat是asyncore的增强版。asyncore则是异步套接字处理程序。
2、Cookie、cookielib
Cookie对象操作,主要用于服务器。cookielib客户端的cookie的支持。
3、email
E-mail邮件消息的支持。包括MIME
4、imaplib
IMAP4客户端模块
5、mailbox
读取多种邮箱的格式
6、mailcap
通过mailcap文件访问MIME配置
7、mhlib
访问MH邮箱
8、poplib
POP客户端模块
9、robotparser
支持解析Web服务器的robot文件
10、SimpleXMLRPCServer
一个简单的XML-RPC服务器
11、smtpd、smtplib
SMTP服务器端模块、SMTP客户端模块
python标准库中常用的网络相关模块并不止以上这些。还有很多,但并不一定都需要了解,只需在需要使用的时候查找参考使用即可。
C. Python网络编程中替代select模块的方法有哪些
、导入模块
import mole
from mole.xx import xx
from mole.xx import xx as rename
from mole.xx import *
二、源模块
yum、pip、apt-get
源码编译安装:Python setup.py build Python setup install
三、用模块
os模块#用作系统级别工作
sys模块#提供解释器相关操作
hashlib模块# 用于加密相关操作
jsonpickle模块 #用于序列化数据
subprocess模块
shuit模块 #文件复制移
logging模块#格式化记录志
random模块 用于取随机数
time datetime模块间模块
re模块 则匹配
D. python怎么经过protobuf完成rpc
客户方像挪用当地办法同样去挪用长途接口办法,RPC 结构供给接口的署理完成,理论的挪用将拜托给署理RpcProxy
。署理封装挪用资讯并将挪用转交给RpcInvoker 去理论履行。在客户真个RpcInvoker 经过衔接器RpcConnector
去保持与效劳端的通道RpcChannel,并运用RpcProtocol
履行协定编码(encode)并将编码后的恳求音讯经过通道发送给效劳方。RPC 效劳端接纳器 RpcAcceptor
接纳客户真个挪用恳求,一样运用RpcProtocol 履行协定解码(decode)。解码后的挪用资讯传送给RpcProcessor
去掌握处置挪用进程,末了再拜托挪用给RpcInvoker 去理论履行并前往挪用后果。
protobuf
rpc在下面组件中首要表演RpcProtocol的人物,使得咱们省去了协定的描绘,而且protobuf协定在编码和时间效力都是上十分高效的,这也是许多公司选用protobuf作为数值序列化和通讯协议的起因。一起protobuf
rpc界说了一个笼统的rpc结构,以下图所示:
RpcServiceStub和RpcService类是protobuf编译器依据proto界说天生的类,RpcService界说了效劳端表露给客户真个函数接口,详细完成需求用户本人担当这个类来完成。RpcServiceStub界说了效劳端表露函数的描绘,并将客户端对RpcServiceStub中函数的挪用同一转换到挪用RpcChannel中的CallMethod办法,CallMethod经过RpcServiceStub传过去的函数描绘符和函数参数对该次rpc挪用停止encode,最后经过RpcConnecor发送给效劳方。自己以客户端相反的进程最后挪用RpcSerivice中界说的函数。现实上,protobuf
rpc的结构仅仅RpcChannel中界说了空的CallMethod,以是详细怎么样停止encode和挪用RpcConnector都要本人完成。RpcConnector在protobuf中没有界说,以是这个完结由用户本人完成,它的效果那是收发rpc音讯包。在效劳端,RpcChannel经过挪用RpcService中的CallMethod来详细挪用RpcService中表露给客户真个函数。
引见了这么多,关于怎样用protobuf rpc来完成一个rpc确定仍是一头雾水吧,下面就用protobuf rpc来完成一个简略的python版rpc demo吧。
下面间接给出demo描绘PRC的proto文件,至于proto文件的编写规定能够参考protobuf官网。
common.proto文件:
package game;
message RequestMessage
{
required string message = 1;
}
message ResponseMessage
{
required string message = 1;
}
game_service.proto文件:
package game;
import "common.proto";
option py_generic_services = true;
service GameService
{
rpc connect_server(RequestMessage) returns(RequestMessage);
}
common.proto文件描绘了RPC中收发的音讯;game_service.proto描绘了效劳器导出的connect_server函数,该函数承受RequestMessage目标作为参数,并前往RequestMessage目标。在运用PRC协定时,必需加之option
py_generic_services =
true;可选项,要否则编译器不会天生蕴含connect_server函数的GameService描绘。
运用编译器protoc编译proto文件,详细号令为:
protoc.exe --python_out=. game_service.proto
编译后天生的文件为game_service_pb2.py,该文件首要是完成了GameService和GameService_Stub类。GameService_Stub类用于客户端挪用者来挪用GameService的效劳。
后面曾经说了,在客户端,RpcChannel只完成了一个空的CallMethod,以是需求担当RpcChannel从新这个函数来encode音讯和发送音讯。在效劳端RpcChannel需求挪用CallMethod来挪用Service中的函数。详细完成以下:
class MyRpcChannel(service.RpcChannel):
def __init__(self, rpc_service, conn):
super(MyRpcChannel, self).__init__()
self.logger = LogManager.get_logger("MyRpcChannel")
def CallMethod(self, method_descriptor, rpc_controller, request, response_class, done):
""""protol buffer rpc 需求的函数,用来发送rpc挪用"""
self.logger.info('CallMethod')
cmd_index = method_descriptor.index
assert(cmd_index < 65535)
data = request.SerializeToString()
total_len = len(data) + 2
self.conn.send_data(''.join([pack('<I', total_len), pack('<H', cmd_index), data]))
def from_request(self):
""""从收集剖析出一个完好的恳求以后调的函数"""
index_data = self.rpc_request.data[0:2]
cmd_index = unpack('<H', index_data)[0]
rpc_service = self.rpc_service
s_descriptor = rpc_service.GetDescriptor()
method = s_descriptor.methods[cmd_index]
try:
request = rpc_service.GetRequestClass(method)()
serialized = self.rpc_request.data[2:]
request.ParseFromString(serialized)
rpc_service.CallMethod(method, self.controller, request, None)
except:
self.logger.error("Call rpc method failed!")
self.logger.log_last_except()
return True
末了那是担当GameService,并完成connect_server函数了。
class GameService(game_service_pb2.GameService):
def __init__(self):
self.logger = LogManager.get_logger("GameService")
def connect_server(self, rpc_controller, request, callback):
self.logger.info('%s', request.message)
至于用于收集收发音讯的RpcConnector,可使用python的asyncore库完成,详细完成在这就不评论了。
从下面的完成来看,protobuf rpc的完成首要囊括编写proto文件并编译天生对应的service_pb2文件,担当RpcChannel并完成CallMethod和挪用Service的CallMethod,担当Service来完成表露给客户真个函数。
E. 用python制作聊天室服务器源代码写好了不知如何让运行
Python是一种即译式的,互动的,...或新建一个界面让数据在互不兼容的系统中流动。...Zope是一个开放源代码的Web应用服务器,采用Python语言开发,使用它您可
F. python select模块怎么用
select是常用的异步socket处理方法。 一般用法 # iwtd, owtd, ewtd分别是需要异步处理的读socket队列,写socket队列(一般不用,设为[])和错误socket队列 # 返回发生事件的读socket队列,写socket队列,错误socket队列 il, ol, el = select( iwtd, owtd, ewtd[, timeout]) for sock in il: # read the sock for sock in ol: # ... # for sock in el: # handle error select和poll都是非常低级的函数,用起来很麻烦。就是相对高级的asyncore也还是太复杂了。如果要使用异步socket编程,建议你考虑一下twisted
G. 如何用Python编写一个手机聊天软件或程序
服务器端涉及到asyncore、asynchat和socket这几个模块,客户端用到了telnetlib、wx、time和thread这几个模块。