网络通信

网络模块实现了与仿真环境通信所需的各种 Socket 类,包括基础 Socket、JSON Socket 以及视频流 Socket。通常,这些类会被 SceneAPI 内部使用,无需直接调用。

异常类

class metacar.sockets.ConnectionClosedError[源代码]

基类:ConnectionError

Socket 基类

class metacar.sockets.SocketBase(host: str, port: int)[源代码]

一个简单的 TCP 服务器基类,实现基于长度 + 内容格式的基本分包。 长度为 4 字节的无符号整数,使用网络字节序(大端序)。 仅支持单个客户端连接。

accept()[源代码]

接受一个新的客户端连接。 如果已有客户端连接,则先关闭旧连接。

close()[源代码]

关闭服务器 socket 及客户端连接。

recv() bytes[源代码]

从客户端接收数据,确保按照长度前缀读取完整的消息。

该方法首先读取 4 字节的长度前缀,然后根据前缀指定的长度读取实际消息内容。 如果连接已关闭,则返回空字节。如果没有客户端连接,则抛出 ConnectionError 异常。

返回:

接收到的字节数据,如果连接已关闭则返回空字节。

抛出:

ConnectionError -- 当没有客户端连接时抛出。

send(data: bytes)[源代码]

发送数据到客户端,数据前加上 4 字节的长度前缀。

参数:

data -- 需要发送的字节数据。

基础 Socket 提供了以下功能:

  • 创建 TCP 服务器并监听连接

  • 接受客户端连接

  • 发送和接收带长度前缀的数据

  • 关闭连接

JSON Socket

class metacar.sockets.JsonSocket(host: str, port: int)[源代码]

基类:SocketBase

支持双向 JSON 通信的 Socket。

recv()[源代码]

接收 JSON 数据。

返回:

接收到的 JSON 数据。

抛出:

ConnectionClosedError -- 当连接已关闭时抛出。

send(data)[源代码]

发送 JSON 数据。

参数:

data -- 需要发送的 JSON 数据。

JSON Socket 在基础 Socket 的基础上提供了:

  • 发送 Python 对象,自动转换为 JSON 并编码

  • 接收 JSON 数据并自动解码为 Python 对象

视频流 Socket

class metacar.sockets.StreamingSocket(host: str, port: int)[源代码]

基类:SocketBase

支持单向接收视频流的 Socket。

recv()[源代码]

接收视频帧。

返回:

接收到的视频帧。

返回类型:

numpy.ndarray

抛出:

ConnectionClosedError -- 当连接已关闭时抛出。

send(data)[源代码]

由于是单向接收视频流,禁用 send 方法。

抛出:

NotImplementedError -- 该方法未实现。

视频流 Socket 在基础 Socket 的基础上提供了:

  • 接收二进制图像数据并转换为 OpenCV 图像

  • 返回的图像可直接用于图像处理和显示