Python套接字实现
Posted
技术标签:
【中文标题】Python套接字实现【英文标题】:Python socket implementation 【发布时间】:2014-05-30 03:47:22 【问题描述】:我是 python 的新手,但是我来自强大的 C 背景,我试图弄清楚它是如何工作的:How can I use a SOCKS 4/5 proxy with urllib2?
我难以理解的部分是它们覆盖了socket.socket
而socket.socket
是运行type(socket.socket)
所告诉的“类型”。所以我对你如何能够覆盖这样的类型感到困惑,或者在这种情况下socket.socket
实际上是他们正在重新定义的函数,因此实际上返回了不同的类型?通常,如果我在函数上运行type
,它会返回它的函数或方法或其他任何东西。
我想我真正想了解的是幕后发生的事情?
【问题讨论】:
你也可以做类似sys.stdout=my_log_file
的事情
这对我来说很有意义,因为 stdout 只是一个指向文件的变量,但 socket.socket 说它是一个类型
【参考方案1】:
我想我真正想了解的是幕后发生的事情?
这是一个很好的问题。
像这样在另一个命名空间中存储变量称为"monkey patching"。
代码示例实际上并没有覆盖类型。相反,它会更新 socket 模块命名空间中的 socket 变量以指向 socks 4/5 类。然后,当 urllib2 查找 socket.socket 变量时,它现在使用 SocksiPy module 而不是原生套接字。
要知道的重要一点是 socket.socket 是一个变量,最初设置为指向内置套接字类型。该变量可以更新为指向新的 4/5 套接字类型。当 urllib2 查找变量时,它使用替代而不是原来的。
从概念上讲,发生的事情大致类似于:
>>> socket = 'old_native_socket'
>>> def urllib2(url):
return 'Looking up', url, 'using', socket
>>> socket = 'new_4_5_socket'
>>> urllib2('http://www.python.org')
Looking up http://www.python.org using new_4_5_socket
下面是math 模块的简单猴子补丁示例:
>>> import math
>>> def area(radius):
return math.pi * radius ** 2.0
>>> math.pi = 3.1 # monkey patch
>>> area(10)
310.0
【讨论】:
我不明白 socket.socket 实际上是一个变量,因为它不应该返回它是一个套接字类型而不是类型吗? 你在隐藏类......在模块级别的类只是变量...... 有趣的好。我已经习惯了 C,一旦设置了类型,它就会一成不变,这对我来说打破了所有约定。我没有意识到这在 python 中是可能的【参考方案2】:考虑以下
class SomeClass:
def __init__(self):
print "I am some class!"
class SomeOtherClass:
def __init__(self):
print "I am some other class!!"
c1 = SomeClass()
c2 = SomeOtherClass()
SomeClass = SomeOtherClass #shadows the other class
c3 = SomeClass()
这只是在模块级别socket
【讨论】:
以上是关于Python套接字实现的主要内容,如果未能解决你的问题,请参考以下文章
python3(socket 实现udp,tcp套接字编程)
python socket 套接字编程 单进程服务器 实现多客户端访问