2

我正在用我的 Raspberry Pi 构建一个网络音乐播放器,我正在尝试提出一个方案,允许我向我的 Pi 发送一个“命令”,这将允许它通过网络执行各种操作(例如运输控制)。

这就是我在接收器上的想法(在某种伪代码中):

while True:
   while nothingIsRecvD:
      do_stuff()
   do_something_with(theDataRecvDfromSocket)

我可以看一些初学者的基本代码吗?

4

2 回答 2

4

需要使用socket模块模块select

要设置套接字,您需要

  1. 用于socket.socket创建套接字。您可能想要使用AF_INET地址系列。对于 TCP,使用SOCK_STREAM; 对于 UDP,使用SOCK_DGRAM.
  2. bind您要侦听的接口和端口的套接字。
  3. 对于 TCP,调用listen套接字。5 是使用的典型积压值。

如果您使用 TCP,那么您刚刚创建了一个侦听套接字。为了实际接收数据,您需要使用accept. 使用连接的套接字,您可以recvsend数据。

UDP 类似,除了不需要接受并且您将使用recvfromandsendto而不是recvand send

但是,这些方法会阻塞,如果我理解正确,您不会想要这样。select.select让您等待事件在任何给定的一组套接字上发生。如果您只想检查是否有某些活动,您还可以提供零超时。一旦它检测到活动,您通常可以执行一次适当的操作而不会阻塞。

使用完套接字后,请在关闭所有连接的套接字close后保持礼貌。

于 2013-09-07T03:25:01.073 回答
0

您可以考虑使用套接字在音乐播放器和服务器之间进行通信。recv() 调用(通常与 TCP 套接字一起使用)或 recvfrom() 调用(通常与 UDP 套接字一起使用)是阻塞的——因此它们应该为您的 nothingIsRecvd 案例提供一个很好的阻塞上下文,并允许您摆脱 " while True”循环。您可以在 Python 库参考中找到示例:http: //docs.python.org/release/2.5.2/lib/socket-example.html

于 2013-09-07T03:18:14.037 回答