像 electron 这样的的 web 转桌面开发框架,为什么不直接架 web 服务通过网络控制本地客户端操作实现程序功能

2017-08-14 17:21:42 +08:00
 qile1

如题,electron 桌面程序开发虽然类似 web 的开发,但是又和 web 开发不完全一样!

那为什么不直接在服务器上面建立 web 服务,通过网页来传输命令直接控制相应的客户端来进行操作,有没有这样的开发框架,请大家推荐。

比如简单的从服务器获取 doc 文件并在本地打开,建立 web 页面后,点击 web 打开按钮,服务器传输 doc 文件到本地客户端并执行 world 的打开命令。

这样的优势就是,web 界面完全是网页形式的,用各种 ie 浏览器都可以操作,而且可以使用 web 各种技术实现炫丽的界面。

有没有这样的框架请推荐一个?

7300 次点击
所在节点    Python
37 条回复
harry890829
2017-08-14 18:47:10 +08:00
看了好多,可能我最近正在做的这个项目和楼主的需求一致,说下我的大致做法和遇到的坑
我这边主项目用 mfc 编写,进行系统钩子、文件操作、socket、sqlite 等操作,使用 mfc 的 web 控件来载入网页,我这里使用 vs2008 编译出来的项目,web 控件内核为 ie7 (这也是最坑的地方)。
mfc 的 web 控件相当强大,你可以使用 c++直接调用 js 的函数,也可以使用 js 调用 mfc 的函数,数据之间交互无障碍。
我这里为了载入快,所以使用的是本地 html/css/js 文件,效果不错,就是要专门为 ie7 做适配。

为了这个项目,我愣是学了前端的一些东西……哦,还有一点,我这里 js 用的是原生 js,并没有使用 jq,听说 jq 某版本后不再支持 ie9 以下的了?印象不深了,因为我这里对 js 要求不高,主要是传递数据,所以就直接用了原生 js
plqws
2017-08-14 18:49:15 +08:00
@qile1 无法实现?麻烦请先搞懂什么是浏览器,什么是 Web 服务器,好好复习一下计算机原理。神烦这种啥都不懂上来就反驳别人的。
tnaxismdc
2017-08-14 21:26:07 +08:00
本质都是 web+nodejs,并没有什么差别。
ysc3839
2017-08-15 09:23:58 +08:00
@qile1 这种情况用 Electron 也可以啊。WebSocket 连接服务器,服务器推送任务,客户端执行。
ysc3839
2017-08-15 09:29:50 +08:00
@harry890829 HTTP 头加个参数,或者 HTML 文件里加个参数可以开启新版本的 IE 内核。修改注册表也可以开启,但并不推荐这么做。Win10 中还有办法使用 Edge 内核。
上述方法的前提是系统中 IE 版本也要高。如果不想考虑这么多的话,可以直接用 CEF https://bitbucket.org/chromiumembedded 缺点是体积很大。
harry890829
2017-08-15 09:33:15 +08:00
@ysc3839 #25 cef 啊,这个之前研究了一下,不过因为我们客户端之前并没有推送 dll 的机制,所以只能暂时先这么解决,一步一步来吧,后期可能选择阉割的 chrome 内核
ysc3839
2017-08-15 09:38:58 +08:00
@harry890829 阉割的 chrome 内核?意思是你要自己修改编译一个内核?我觉得这么做成本太高,重复造轮子。
另外,你可以考虑把 cef 静态链接进 exe。
harry890829
2017-08-15 09:59:21 +08:00
@ysc3839 #27 自己做太麻烦了,网上有一些魔改的,貌似 10mb 大小吧,cef 静态链接啊,晚点看看大小吧
ysc3839
2017-08-15 10:04:10 +08:00
@harry890829 网上这类也只是业余研究的性质吧,不能保证稳定可靠的。我还是觉得 CEF 靠谱些。
harry890829
2017-08-15 10:12:18 +08:00
@ysc3839 #29 是啊,要不是因为不可靠,我也不会先用 ie7 对付了……
zjddp
2017-08-15 10:55:00 +08:00
怎么感觉这是巨硬 dot net 框架最一开始的思路呢。。。
winglight2016
2017-08-15 11:13:12 +08:00
当你不再考虑 M$的框架后,就明白其他软件框架的思路是什么了?否则,还是继续 MFC、IE 吧,其他框架不适合你
qile1
2017-08-15 13:56:54 +08:00
@plqws 计算机原理就不复习了!多谢回复,看你回复后,我又查询了下浏览器调用本地文件相关信息,受到很多启发,我说浏览器不支持本地文件操作确实不对。自己着手写了个简单的客户端,准备一会测试下。

我先在本地建立 web 服务,在浏览器访问 http://127.0.0.1/runexe?id=201708180002
通过截取路径来启动程序并传递参数
fomenyesu
2017-08-15 15:17:57 +08:00
就是 web 版本的远程桌面。现在同类产品太多了。electron 这么大的软件,没什么市场价值。
qile1
2017-08-16 01:53:39 +08:00
我简单写了一个测试程序,直接控制本地 ecg 程序打开一个文件后检测关闭状态进行后期处理
’‘’
# -*- coding: utf-8 -*-
from http.server import HTTPServer, BaseHTTPRequestHandler
import io, shutil
import re # 引入正则表达式对象
import urllib # 用于对 URL 进行编解码
import os, os.path, sys
import win32process, win32event
mainfile = os.getcwd()
class TestHTTPHandler(BaseHTTPRequestHandler):
# 处理 GET 请求
def do_GET(self):
# 页面输出模板字符串
templateStr ='''
<html><head><title>QR Link Generator</title></head><body>%s<br><br><form action="/qr" name=f method="GET"><input maxLength=1024 size=70
name=s value="" title="Text to QR Encode"><input type=submit
value="Show QR" name=qr></form><a href='/runtest?DataRecive20160706185117'>http://127.0.0.1:8080/runtest?DataRecive20160706185117</a></body></html> '''
# 将正则表达式编译成 Pattern 对象
pattern = re.compile(r'/qr\?s=([^\&]+)\&qr=Show\+QR')
# 使用 Pattern 匹配文本,获得匹配结果,无法匹配时将返回 None
match = pattern.match(self.path)
qrImg = ''
teststr=match
teststr2=(self.path)
teststr3=teststr2.split('\\')[0]
runname=teststr2[1:teststr2.find('?')]
xmlfilename=teststr2[teststr2.find('?')+1:]
if (runname=='runtest'):
exe_path = 'D:\pythontest\ecgfiles' # sys.argv[1]
exe_file = 'ECGView.exe' # '.argv[2]
ECGPath=os.path.join(mainfile, "ecgfiles", "ECGPath.dir")
f = open(ECGPath, "w") # 覆写模式
f.write("D:\\pythontest\\ecgfiles\\ecgdata\\"+xmlfilename+".xml")
f.close()
try:
handle = win32process.CreateProcess(os.path.join(exe_path, exe_file),
'', None, None, 0,
win32process.CREATE_NO_WINDOW,
None,
exe_path,
win32process.STARTUPINFO())
running = True
except Exception as e:
print("Create Error!")
handle = None
running = False
while running:
rc = win32event.WaitForSingleObject(handle[0], 1000)
if rc == win32event.WAIT_OBJECT_0:
running = False
boday1=(templateStr % qrImg)
enc = "UTF-8"
encoded = ''.join(boday1).encode(enc)
f = io.BytesIO()
f.write(encoded)
f.seek(0)
self.send_response(200)
self.send_header("Content-type", "text/html; charset=%s" % enc)
self.send_header("Content-Length", str(len(encoded)))
self.end_headers()
shutil.copyfileobj(f, self.wfile)

httpd = HTTPServer(('', 8080), TestHTTPHandler)
print("Server started on 127.0.0.1,port 8080.....")
httpd.serve_forever()
‘’‘
shuax
2017-08-23 11:55:07 +08:00
ie ?兼容就蛋疼死了,不如内嵌一个浏览器,硬盘反正便宜。
yaolixing
2018-03-01 11:09:16 +08:00
推荐他山界面框架

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX