Replies: 1 comment 1 reply
-
其实有一种方案是我们直接起一个 HTTP Server,Server 地址通过 Bonjour 告知客户端(或者不采用 Bonjour 的话可以采用其他方案设置,最简单粗暴的方案用户手动填写 IP,复杂一点的是 UDP 广播),Register 直接把信息 POST 请求给
出现问题的话不一定有机会执行 Unregister,考虑到内网使用,可以考虑使用心跳包方案作为替代。
目录结构由服务端定义是一种更符合 OI 习惯的方案
服务发现可以直接复用已有的公开技术栈,使用 mDNS+DNS-SD (Bonjour),服务端注册 Bonjour 服务,客户端在局域网内查询服务。如果该校机房设置了计算机名,mDNS 也可以更简单地完成名称到 IP 的映射。
如果使用 Bonjour 则不需要提前约定 gRPC 端口, Bonjour 注册服务时可以现场填写,提供更大的灵活性;使用 Bonjour 的话则使用公开协议已有的接口,不需要自己定义一个单独的 UDP 广播接口,减少需要的防火墙调整。
不好说,有可能会发生老师/学长用笔记本电脑在机房收取机房电脑上的代码的情况。但是个人觉得用 Webview 并不是很适合这个场景。
沿用本体技术栈可以降低用户的心智负担。
Flutter 中文和字体支持一直很烂。 |
Beta Was this translation helpful? Give feedback.
-
#66
这里开个讨论,对一下功能和技术选择,确定下来之后我大概 9 月份开始开发。
功能上
需要开发一个
LemonLime-Client
,可以输入 姓名 和 收取目录,当有收取请求的时候,可以选择允许或拒绝(防止机房内有人冒充老师收取)。在
LemonLime
本体上添加:搜索局域网中所有选手,收取局域网中所有选手的文件。收取时,新建以选手姓名命名的文件夹,文件夹下的结构同选手本地选择的收取目录。可以限制最大收取文件大小和最大文件夹递归深度,以及后缀名等等(待讨论)。技术选择
机器间通信:选择 gRPC。主要是提高开发效率以及性能的考虑,Client 端的开发语言可以不只限于 Qt。提供如下接口(暂定)
具体通信过程:本体 UDP 在局域网内广播,Client 收到 UDP 广播后,调用
RegisterContestant
向本体注册,然后若 UDP 指定发送文件(区分搜索选手和收取选手文件两个功能。这里因为之前的注册过程已经获取到了所有 Client 的 IP,所以可以对点通信再发送收取文件的请求,需要再讨论一下,每个 Client 可以再成为一个 gRPC 的 Server,提供收取文件的接口),则遍历文件夹使用MakeDir
和SendFile
。本体需要维护 IP 到 userName 的映射。其他问题:关于端口的选择,需要确定两个端口,分别是 UDP 和 gRPC 的。
Client 端 GUI 技术选择
考虑到 Client 端实现的功能较少,暂时有三个待选项
Beta Was this translation helpful? Give feedback.
All reactions