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.socketsocket.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套接字实现的主要内容,如果未能解决你的问题,请参考以下文章

Python网络编程—socket套接字编程(UDP)

Python网络编程—socket套接字编程(TCP)

python3(socket 实现udp,tcp套接字编程)

python socket 套接字编程 单进程服务器 实现多客户端访问

Python网络编程通过ThreadingMixIn实现多线程异步套接字程序

通过python实现TCP编程