【问题标题】:Just get one last value from socket只需从套接字获取最后一个值
【发布时间】:2014-07-13 00:47:20
【问题描述】:

我每秒向一侧的套接字发送数据,但我可以随时从另一侧读取该数据。这是作者:

from settings import Config

filename = Config.NAVIGATION_SOCKET_FILE

client = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
client.settimeout(None)
while True:
    try:
        client.connect(filename)
        break
    except Exception:
        continue
messages = ["$GPRMC,125504.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,,*17",
            "$GPRMC,155604.049,A,5542.2389,N,03741.6063,E,0.06,25.82,200906,,,*19",]
while True:
    msg = random.choice(messages)
    client.send(msg)
    print msg
    time.sleep(1)

这里是读者:

navigation_socket = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
if os.path.exists(app.config['NAVIGATION_SOCKET_FILE']):
        os.remove(app.config['NAVIGATION_SOCKET_FILE'])
navigation_socket.bind(app.config['NAVIGATION_SOCKET_FILE'])

class NavigationInfo(restful.Resource):
    def get(self):
        msg = navigation_socket.recv(1024)
        regex = re.compile(r"^\$GPRMC,(?P<time>\d{6}\.\d{3}),(?P<status>A|V),"
                           r"(?P<latitude>\d{4}\.\d{4}),(?P<lat_n_s>N|S),"
                           r"(?P<longitude>\d{5}\.\d{4}),(?P<long_e_w>E|W),"
                           r"(?P<hor_speed>\d+.\d+),(?P<track_angle>\d+.\d+),"
                           r"(?P<date>\d{6}),(?P<magnetic_declination>\d+\.\d+)?,"
                           r"(?P<magnetic_decl_direction>\d)?,"
                           r"(?P<mode>A|D|E|N)?\*(?P<checksum>\d\d)")
        result = regex.match(msg)
        navigation_info = result.groupdict()
        return navigation_info

所以第一个问题是,当缓冲区已满(至少我看到的是这样)并且当我在另一端请求数据时,它太旧了。

我可以在缓冲区中存储一个值然后重写它吗?还是我完全搞错了?

【问题讨论】:

  • 你可能会考虑在你第一次睡觉的时候睡几秒钟,以防万一。 (如果连接提高,你将坚持 100% 的 CPU,一无所获)。
  • @JulienPalard 谢谢。但对我来说,这里的主要问题是我无法从套接字获取新数据。

标签: python sockets flask unix-socket flask-restful


【解决方案1】:

我认为您正在使用相反的解决方案。

而不是推送消息,而不是拉消息?

您的服务器可能如下所示:

  1. 等待连接
  2. 随机发送消息
  3. 转到步骤 1

您的客户端可能只是在需要消息时连接到服务器。

在您的情况下,连接“一直打开”,在我的解决方案中,套接字仅在需要时打开。并在消息传递后立即关闭。

【讨论】:

  • 谢谢,我想我明白了。
  • yw,如果你被卡住了,请不要犹豫再问一次。
  • 你能提供一段代码作为例子吗?我现在真的不知道如何在不使用两个 unix 套接字的情况下做那件事。即使我有两个,我是否需要使用线程来同时处理它们?
  • RTFM: docs.python.org/2/library/… (如果你真的想坚持使用 Unix 套接字,请使用 UnixStreamServer,但 TCP 也很棒)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
相关资源
最近更新 更多