使用 JSON 数据向 websocket 服务器发送请求

Posted

技术标签:

【中文标题】使用 JSON 数据向 websocket 服务器发送请求【英文标题】:Send request to websocket server using JSON data 【发布时间】:2020-01-20 21:54:00 【问题描述】:

基本上,我在一台计算机上运行 OBS,我需要通过第二台计算机与之交互。 我正在使用一个OBS-WebSocket 插件,它在 OBS 上创建一个 websocket 服务器来发送远程命令。

我的目标是在我按下第二台(远程)计算机上的键时在 OBS 上设置可见/不可见源。 我对那个按键部分没有意见。我的问题是我不知道如何正确地将请求/命令发送到 websocket 插件(它需要 JSON 格式,因为这是数据的格式)。

主代码(C#)

static void Main(string[] args)
    
        using (var ws = new WebSocket("ws://192.168.1.1:1122"))
        

            ws.Connect();
            ws.OnMessage += (sender, e) =>
                Console.WriteLine(e.Data);
            ws.Send("REPLACE WITH JSON REQUEST DATA");
            Console.ReadKey(true);
        
    

下面是我在 OBS 中打开或关闭源时从 websocket 接收到的数据示例。

您可以清楚地看到“可见性”是真还是假。

*这个 'item-visible' 是我需要设置的让 OBS 隐藏或显示来源的设置。*

↓ 源在 OBS 中可见 ↓


"item-id": 10,
"item-name": "map",
"item-visible": true,
"scene-name": "ONHOLD",
"update-type": "SceneItemVisibilityChanged"

↓ 来源隐藏在 OBS 中 ↓


"item-id": 10,
"item-name": "map",
"item-visible": false,
"scene-name": "ONHOLD",
"update-type": "SceneItemVisibilityChanged"

【问题讨论】:

【参考方案1】:

你可以在 Github 官方 repo 中看到 example test usages。

如果您查看那里,您会看到应该解析 e.Data。然后,您可以根据需要进行分配,例如:

public string SetIsVisible(MessageEventArgs e, bool isVisible)

    JObject body = JObject.Parse(e.Data);
    body["item-visible"] = isVisible;
    return body.ToString();

...然后将返回的字符串发送到您的 websocket:

ws.Send(SetIsVisible(e, isVisible)); // isVisible is boolean you should assign

附:如果您想使用静态类型的 DTO,只需生成一个(例如 here):

public partial class OBSSource

    [JsonProperty("item-id")]
    public long ItemId  get; set; 

    [JsonProperty("item-name")]
    public string ItemName  get; set; 

    [JsonProperty("item-visible")]
    public bool ItemVisible  get; set; 

    [JsonProperty("scene-name")]
    public string SceneName  get; set; 

    [JsonProperty("update-type")]
    public string UpdateType  get; set; 

...然后:

public string SetIsVisible(MessageEventArgs e, bool isVisible)

    OBSSource obsSource = JsonConvert.DeserializeObject<OBSSource>(e.Data);
    obsSource.ItemVisible = isVisible;
    return JsonConvert.SerializeObject(obsSource);

...然后将其序列化到上面的 websocket 中。

【讨论】:

以上是关于使用 JSON 数据向 websocket 服务器发送请求的主要内容,如果未能解决你的问题,请参考以下文章

通过 Django Channels 和 Websockets 向客户端推送实时更新

websocket 发送问题

如何使用 Python(带有 websockets 的服务器)和 JavaScript(客户端)接收 JSON 数据

初识Websocket

客户端与服务器端使用webSocket进行交互,使用json解析数据

通过 Websockets 从 Python Flask 服务器连续向客户端发送数据