代码: 全选
# -*- encoding: UTF-8 -*-
'''ObjectSocket 提供线程安全的利用 socket 传送 python 对象的方法.'''
import socket
import pickle
import threading
class ObjectSocketSendException(Exception):
'''此异常在无法发送所有字节时抛出.'''
pass
class InvalidObjectSocket(Exception):
'''此异常在对无效的 ObjectSocket 对象操作时抛出.'''
pass
class ObjectSocket(object):
'''ObjectSocket 使用 socket 来传送对象.'''
def __init__(self, socket):
'''构造函数, socket 参数必须是有效的"新的" socket 对象.
socket 用于构造 ObjectSocket 后不应该再对其做任何操作.
'''
self._socket = socket
self._socket_file = self._socket.makefile('rb')
# 锁都是私有的, 应该不会死锁.
self._sendlock = threading.Lock()
self._recvlock = threading.Lock()
self._valid = True
def IsValid(self):
'''验证 ObjectSocket 是否有效(未关闭).'''
return self._valid
def send(self, obj):
'''发送一个能被 pickle 处理的对象. 如果失败抛出异常.'''
self._sendlock.acquire()
try:
if not self._valid:
raise InvalidObjectSocket()
s = pickle.dumps(obj)
l = self._socket.send(s)
if len(s) != l:
raise ObjectSocketSendException()
finally:
self._sendlock.release()
def recv(self):
'''接收并返回对象.'''
self._recvlock.acquire()
try:
if not self._valid:
raise InvalidObjectSocket()
obj = pickle.load(self._socket_file)
finally:
self._recvlock.release()
return obj
def close(self):
'''关闭连接'''
self._sendlock.acquire()
self._recvlock.acquire()
try:
self._socket.close()
finally:
self._valid = False
self._recvlock.release()
self._sendlock.release()
def __del__(self):
self.close()
该类是线程安全的
帮忙看看有没有漏洞, 或者显然的bug..