Python中的网络编程

Posted

技术标签:

【中文标题】Python中的网络编程【英文标题】:Network programming in Python 【发布时间】:2010-01-24 18:51:42 【问题描述】:

我应该使用什么库进行网络编程? sockets是最好的,还是有更高级别的接口,即标准?

我需要一些非常跨平台的东西(即 Linux、Windows、Mac OS X),并且它只需要能够使用相同的库连接到其他 Python 程序。

【问题讨论】:

【参考方案1】:

您只想在节点之间发送 python 数据(可能在不同的计算机上)?您可能想查看 SimpleXMLRPCServer。它基于内置的 HTTP 服务器,它基于内置的 Socket 服务器,这两种服务器都不是周围最强大的服务器,但很容易快速设置:

from SimpleXMLRPCServer import SimpleXMLRPCServer
server = SimpleXMLRPCServer(("localhost", 9876))

def my_func(a,b):
    return a + b

server.register_function(my_func)
server.serve_forever()

并且易于连接:

import xmlrpclib
s = xmlrpclib.ServerProxy('http://localhost:9876')

print s.my_func(2,3) 
>>> 5
print type(s.my_func(2,3))
>>> <type 'int'>
print s.my_func(2,3.0):
>>> 7.0

Twisted 在工业应用中很受欢迎,但它的学习曲线很残酷。

【讨论】:

+1 作为另一个意识到 OP 不一定想要网络,只需要通信的人。【参考方案2】:

有一个你可能感兴趣的框架:Twisted

【讨论】:

【参考方案3】:

答案取决于你想要做什么。

“我应该使用什么库来进行网络编程?”很模糊。

例如,如果您想做 HTTP,您可能会查看 urllib、urllib2、httplib、sockets 等标准库。这完全取决于您要使用的协议,以及您希望在哪个网络层工作。

python 中有用于各种网络任务的库...电子邮件、网络、rpc 等...

对于初学者,请查看标准库参考手册并查看您想要执行哪些任务,然后从那里开始:http://docs.python.org/library/index.html

【讨论】:

【参考方案4】:

如前所述,Twisted 是最受欢迎的(到目前为止)。然而,还有很多其他的选择值得探索。 Tornado 和 Diesel 可能是前两个竞争者。比较完整的比较is found here。

【讨论】:

如果您添加指向 Twised 的链接,我认为您的回答比 Jeramy 的要好。【参考方案5】:

我个人只是使​​用标准库中的 asyncore,这有点像 Twisted 的精简版,但这是因为我更喜欢简单和低级的接口。如果您想要更高级别的接口,尤其是与您自己程序的另一个实例通信,您不必担心网络层,可以考虑使用更高级别的东西,例如RPyC 或pyro。然后,网络成为一个实现细节,您可以专注于发送信息。

【讨论】:

【参考方案6】:

很多人都喜欢Twisted。有一段时间我是一个超级粉丝,但在使用它并更多地思考它时,我变得不再抱有幻想。这很复杂,最后我看了一下,其中很多都假设您的程序将总是能够发送数据,从而导致您的程序可能会不断增加内存使用量来缓冲要发送的数据'没有被远端接听或接听速度不够快。

在我看来,这很大程度上取决于你想做什么样的网络编程。很多时候,您在等待 IO 时并不真正关心完成工作。例如,HTTP 非常面向请求-响应,如果您只与单个服务器通信,则几乎没有理由需要 Twisted 和普通套接字或 Python 的内置 HTTP 库之类的东西。

如果您正在编写任何类型的服务器,您几乎肯定需要事件驱动。 Twisted 在那里有一点优势,但对我来说仍然过于复杂。例如,Bittorrent 是用 Python 编写的,根本不使用 Twisted。

另一个有利于 Twisted 的因素是已经为它编写了许多协议的代码。因此,如果您想使用现有协议,可能已经为您完成了很多艰苦的工作。

【讨论】:

【参考方案7】:

如果您不需要高性能,我认为标准库中的socket 模块是一个不错的选择。

这是一个非常著名的 API,几乎所有语言的开发人员都知道它。这很简单,互联网上有很多可用的信息。此外,其他人会更容易理解您的代码。

我猜想像 Twisted 这样的事件驱动框架具有更好的性能,但在基本情况下,标准套接字就足够了。

当然,如果你使用更高级的协议(http、ftp...),你应该使用python标准库中相应的实现。

【讨论】:

【参考方案8】:

Socket是底层api,直接映射到操作系统接口。 Twisted, Tornado ... 是高级框架(当然它们是建立在套接字上的,因为套接字是低级的)。 谈到 TCP/IP 编程,您应该具备一些基本知识来决定您应该使用什么:

您会使用 HTTP、FTP 等知名协议还是创建自己的协议? 阻塞还是非阻塞? Twisted、Tornado 都是非阻塞框架(基本类似于 nodejs)。 当然,socket 可以做任何事情,因为所有其他框架都是基于它的;)

【讨论】:

以上是关于Python中的网络编程的主要内容,如果未能解决你的问题,请参考以下文章

你了解Python编程中的break吗?

python中的socket编程

Python2与Python3的区别/网络编程/socketserver模块中的多线程

编程基础之Python12Python中的语句

python中的TCP编程学习

《Python编程》课程报告 python技术在数据分析中的应用之网络爬虫