【问题标题】:Creating connection between two computers in python在python中创建两台计算机之间的连接
【发布时间】:2009-06-01 20:32:24
【问题描述】:

问题:如何创建一个 python 应用程序,它可以通过互联网连接并发送数据包到另一台运行相同应用程序的计算机?有没有我可以使用的现有代码/库?

背景:我对编程很陌生(HS 高级)。我在 python 中创建了很多简单的东西,但我最近决定开始一个更大的项目。我正在考虑创建一个万智牌补充包草稿模拟器,但鉴于我的技能,我不确定这是否可行,所以我在开始之前四处询问。该应用程序需要在计算机之间发送有关正在拾取/传递哪些卡片的数据。

谢谢!

【问题讨论】:

    标签: python networking


    【解决方案1】:

    Twisted 是一个在 MIT 授权的 python 事件驱动网络引擎。意味着一台机器可以与一台或多台其他机器通信,同时在接收和发送数据之间做其他事情,所有这些都是异步的,并在单个线程/进程中运行。

    它支持许多开箱即用的协议,因此您也可以使用现有的协议。这更好,因为您可以从 3rd 方软件获得对协议的支持(即使用 HTTP 进行通信意味着使用 HTTP 的中间件软件将兼容:代理等)

    如果您愿意,也可以轻松创建自己的通信协议。

    documentation 充满了例子。

    【讨论】:

      【解决方案2】:

      标准库包括 SocketServer(记录在 here),它可以满足您的需求。

      但是我想知道是否有更好的解决方案是使用消息队列。许多好的实现已经存在,包括 Python 接口。我以前用过RabbitMQ。这个想法是计算机都订阅队列,并且可以发布或监听事件。

      【讨论】:

        【解决方案3】:

        Python Standard Library 是一个很好的起点。特别是有几个部分是相关的:

        既然您提到您没有这方面的经验,我建议您从基于 HTTP 的实现开始。 HTTP 协议相当简单且易于使用。此外,还有一些不错的框架可以支持此操作,例如用于服务器的webpy 和用于客户端的标准库中的HTTPLib

        如果您真的想深入了解网络,那么基于socket 的实现可能具有教育意义。这将教您大量网络代码中使用的基本概念,同时产生类似于文件流的接口。

        【讨论】:

        • 向初学者推荐低级套接字的强-1。根据我的教学经验,教授一个高级框架,然后展示下划线的实现比教如何做错更有意义。
        • 我想这取决于学生想要从中获得什么以及他们真正处于什么水平。从我的观点来看,如果我想了解网络通信并且不知何故从未了解过套接字,我会很沮丧。在形成初始连接后,使用套接字仅比读/写文件稍微困难一些。好处是学生可以考虑他们想要如何表示数据。
        • 我编辑了帖子以建议 HTTP(带有框架),但在关于套接字的注释中留下了好奇。
        • @Doug:套接字真的很难正确处理。这比读取文件要困难得多。学生即使想学low-level,也应该先学high-level,打好基础,再研究下划线的实现。或者你建议在 python 之前学习汇编?对于您的第二点,学生将不得不考虑如何表示数据,我不认为学习套接字会以任何方式改变这一点。
        • @nosklo 我的回复不是针对任何编写生产代码的人,而是针对那些希望学习一些东西的人。显然,学习相同的概念有不同的方法。我承认从套接字接口开始并不是获得工作代码的最快方法,也可能不是健壮/稳定系统的最佳选择。但是,我坚持我的说法,即学习如何使用套接字接口是很有价值的知识。
        【解决方案4】:

        另外,请查看Pyro(Python 远程处理对象)。请参阅this answer 了解更多详情。

        Pyro 基本上允许您将 Python 对象实例发布为可以远程调用的服务。 Pyro 可能是实现 Python 到 Python 进程通信的最简单方法。

        【讨论】:

          【解决方案5】:

          同样值得关注 Kamaelia 的这类东西 - 它最初的用例是网络系统,并且使构建这样的东西相对直观。 部分链接:Overview of basic TCP systemSimple Chat serverBuilding a layered protocolwalk-through of how to evolve new components。其他极端:P2P无线系统:source,peer.

          如果有什么不同的话,我们已经通过连续 3 年参与 Google Summer of Code 测试了新手是否可以使用该系统,并积极招募有经验和没有经验的开发人员。他们都设法建立了有用的系统。

          基本上,如果您曾经使用过 unix 管道,这些想法应该很熟悉。

          警告:我写了 Kamaelia 的主要部分 :-)

          如果你想学习如何做这些事情,尝试几种不同的方法是有意义的,你一定要看看 Twisted(这个问题的标准答案)、Pyro 和标准库工具。每个人都有不同的方法,学习它们一定会让你受益!

          但是,像 nosklo 一样,我建议不要直接使用套接字库,而是使用库 - 仅仅是因为正确地进行套接字编程比人们往往意识到的要困难得多。

          【讨论】:

            【解决方案6】:

            通信将通过套接字以一种或另一种方式进行。只是一个问题,您是使用现有的高级库,还是自行开发。

            如果您将此作为一种学习体验,可能希望从低级别开始,以了解真正的具体细节。这意味着您可能希望从a SocketServer 开始,使用 TCP 连接(TCP 基本上可以保证数据的传递;UDP 则不是)。

            谷歌一些简单的示例代码。设置一个非常容易。但是你必须定义你的通信协议的所有细节:哪一端发送什么时间和什么,哪一端监听以及什么时候监听,监听器期望什么,它是否回复确认接收等等。

            【讨论】:

            • -1:我非常不同意看到 TCP 套接字螺母和螺栓会有所帮助。直接使用套接字只会让您学习如何编写代码。只需学习高水平,然后学习您选择的任何库。
            • 我很少用 C 进行编程,但我很高兴我知道它,因为它让我更深入地了解高级语言在幕后实际使用内存和复杂的数据类型。我认为套接字编程也是如此:一个生产应用程序几乎永远不会进入 TCP 级别,但是该级别的一些练习可以让您更好地了解更高级别的框架正在做什么。
            • @John Pirie:是的,但你认为新手应该首先学习 C(或汇编)吗?我不这么认为。我认为自然的趋势是先学习高层次的,然后再根据需要深入了解低层次的概念,等一般概念学得好之后。我的观点是框架应该放在第一位。
            猜你喜欢
            • 2014-12-03
            • 1970-01-01
            • 2012-02-02
            • 1970-01-01
            • 1970-01-01
            • 2011-05-25
            • 1970-01-01
            • 1970-01-01
            • 2021-03-03
            相关资源
            最近更新 更多