在 python 中通过本地服务器进行通信

Communicating over a local server in python

我正在 python 中创建一个协作式笔记应用程序。 在这里,计算机上的一个人 运行 应用程序可以创建服务器,随后屏幕上的变化([颜色,像素],其中像素 = [x,y])将传输到连接到服务器的其他人。

我正在使用 kivy 创建应用程序。我的问题是关于通过服务器传输数据。 我可以使用这个创建服务器:

import socket
ip_address=socket.gethostbyname(socket.gethostname())
execfile( "manage.py runserver "+ip_address+":8000" )

现在,其他人如何连接到服务器并请求数据(假设上面的代码是正确的)。另外,如何在 django 中发送数据。

好吧,Django 是一个框架,允许创建可通过 HTTP 协议访问的站点或 API。这对您有几个影响:

  1. 除非客户端请求,否则服务器无法向客户端发送消息。 HTTP 是一种 "request-response" 协议。客户端发送请求(例如,http://server.com/getUpdates?id=100500)并从服务器获得响应。

  2. 创建要求服务器始终向其更新的客户端是一种不好的做法,可能会导致服务器 DoS。

  3. 虽然可以使用 WebSockets,但是使用 Django 来完成这样的任务实在是太过分了。

总而言之,您需要一个可靠的双工通道来双向发送数据。我将从 TCP 服务器开始,而不是 HTTP。幸运的是,Python stdlib 有一个模块,您可以从 - socketserver.

开始

补充阅读

  1. TCP
  2. UDP(您可能需要这个用于广播)
  3. Berkeley sockets(底层socketserver模块的套接字标准)

TCP 与 UDP

在决定使用何种协议时,应考虑以下方面:

  • TCP 可靠。消息永远不会隐式消失。如果出现网络错误,将重新发送消息。如果没有连接,将引发显式错误。 TCP 使用多种算法来适应网络通道。它是一种智能协议。

  • UDP 不可靠。它不具备 TCP 所具有的任何功能。数据包可以消失,重新排序。但是 UDP 消息是轻量级的,在有经验的人手中,它们可以使网络动作游戏和流式视频等系统栩栩如生(丢失和重新排序的消息在这里并不重要,TCP 变得太慢了)。

所以我建议从 TCP 开始。它比 UDP 更容易快速正确地工作。如果您对 TCP 有一些经验并且有很多人使用您的应用程序并希望获得尽可能低的延迟,请切换到 UDP。