SuperSocket icon indicating copy to clipboard operation
SuperSocket copied to clipboard

建议 SuperWebSocket 增加 纯 Json 格式的协议模板

Open waleswood opened this issue 4 years ago • 7 comments

最近在好几个项目中都用到了 WebSocket,在与前端进行协议定制时,前端都倾向于纯 Json 格式的协议,但是现在已有的 JsonCommandBase 还是使用的 key json 这种形式。

建议增加一个 JsonObjectCommand 之类的协议模板,支持用户传入普通的 class 对象 或者 JsonObject,可以指定哪个 key 是 命令的 name。实现自动转换映射,然后执行对应的 Command。

waleswood avatar Aug 06 '20 01:08 waleswood

Take it! I will think about how to implement this feature.

kerryjiang avatar Aug 07 '20 06:08 kerryjiang

Actually you can customize it by yourself in SuperSocket 2.0. Assign the package key after you decode the package data.

kerryjiang avatar Aug 09 '20 21:08 kerryjiang

Do you have any clear requirement for this feature or suggestions about the APIs?

Anyway, you can do something like the piece of code below when you decode the package:

package.Key = jsonObject["key"];

kerryjiang avatar Aug 20 '20 17:08 kerryjiang

我设想的是这样,纯 JSON 形式的命令,比如我现在用的

{
  "operate": "delete",
  "data": {
    "file_uid": "3323",
    "file_thumbnai_uid": "3324",
    "business_id": 1263644100733702144
  }
}

data 对应的 class 为

public class DeleteMessage
    {
        /// <summary>
        /// 文件唯一Id
        /// </summary>
        [JsonProperty(PropertyName = "file_uid")]
        public string FileUid { get; set; }
       
         /// <summary>
        /// 缩略图唯一Id
        /// </summary>
        [JsonProperty(PropertyName = "file_thumbnai_uid")]
        public string FileThumbnaiUid { get; set; }

        /// <summary>
        /// 业务唯一号
        /// </summary>
        [JsonProperty(PropertyName = "business_id")]
        public long BusinessId { get; set; }
    }

我希望有个命令模板,可以传入两个参数 keyDeleteMessage,这样在这个命令下面直接就可以 使用 DeleteMessage 这样的对象了。 或者传入一个包含 key 的大类也可以。 我理解的使用json就是为了方便序列化和反序列化,那么我希望json的命令模板可以自动实现这一点。

waleswood avatar Aug 26 '20 02:08 waleswood

我设想的是这样,纯 JSON 形式的命令,比如我现在用的

{
  "operate": "delete",
  "data": {
    "file_uid": "3323",
    "file_thumbnai_uid": "3324",
    "business_id": 1263644100733702144
  }
}

data 对应的 class 为

public class DeleteMessage
    {
        /// <summary>
        /// 文件唯一Id
        /// </summary>
        [JsonProperty(PropertyName = "file_uid")]
        public string FileUid { get; set; }
       
         /// <summary>
        /// 缩略图唯一Id
        /// </summary>
        [JsonProperty(PropertyName = "file_thumbnai_uid")]
        public string FileThumbnaiUid { get; set; }

        /// <summary>
        /// 业务唯一号
        /// </summary>
        [JsonProperty(PropertyName = "business_id")]
        public long BusinessId { get; set; }
    }

我希望有个命令模板,可以传入两个参数 keyDeleteMessage,这样在这个命令下面直接就可以 使用 DeleteMessage 这样的对象了。 或者传入一个包含 key 的大类也可以。 我理解的使用json就是为了方便序列化和反序列化,那么我希望json的命令模板可以自动实现这一点。

感觉你这个挺好做啊,解析出Json在反序列化就好;发送同理。

DavidZhiXing avatar Mar 31 '21 15:03 DavidZhiXing

我设想的是这样,纯 JSON 形式的命令,比如我现在用的

{
  "operate": "delete",
  "data": {
    "file_uid": "3323",
    "file_thumbnai_uid": "3324",
    "business_id": 1263644100733702144
  }
}

data 对应的 class 为

public class DeleteMessage
    {
        /// <summary>
        /// 文件唯一Id
        /// </summary>
        [JsonProperty(PropertyName = "file_uid")]
        public string FileUid { get; set; }
       
         /// <summary>
        /// 缩略图唯一Id
        /// </summary>
        [JsonProperty(PropertyName = "file_thumbnai_uid")]
        public string FileThumbnaiUid { get; set; }

        /// <summary>
        /// 业务唯一号
        /// </summary>
        [JsonProperty(PropertyName = "business_id")]
        public long BusinessId { get; set; }
    }

我希望有个命令模板,可以传入两个参数 keyDeleteMessage,这样在这个命令下面直接就可以 使用 DeleteMessage 这样的对象了。 或者传入一个包含 key 的大类也可以。 我理解的使用json就是为了方便序列化和反序列化,那么我希望json的命令模板可以自动实现这一点。

感觉你这个挺好做啊,解析出Json在反序列化就好;发送同理。

是不复杂,不过除了序列化和反序列化,还有一个是适配 supersocket 的命令模板,支持通过 key 去执行对应的命令。

waleswood avatar Apr 01 '21 10:04 waleswood

SuperSocket 2.0的WebSocket部分支持发送string, 注意, 此时的AppSession要指定为WebSocketSession

Socket部分可以采用TextPackageInfo来实现发送string, 不好的地方就是需要在结尾添加\r\n , 不过和前端通信还是建议使用WebSocket

顺便写一个需要注意的点, 如果使用Socket的TextPackageInfo发送时, 一定要把json数据转成字符串再传入SendAsync方法, 否则可能无法发送

wosledon avatar Apr 02 '21 10:04 wosledon