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

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

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

【问题讨论】:

    标签: python sockets network-programming


    【解决方案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 是最受欢迎的(到目前为止)。然而,还有很多其他的选择值得探索。 TornadoDiesel 可能是前两个竞争者。比较完整的比较is found here

        【讨论】:

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

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

        【讨论】:

          【解决方案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 可以做任何事情,因为所有其他框架都是基于它的;)

              【讨论】:

                猜你喜欢
                • 2010-10-09
                • 2012-04-27
                • 2023-03-27
                • 2011-04-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-11-09
                • 2010-10-11
                相关资源
                最近更新 更多