我们需要将本地应用程序与web应用程序进行通信。
我们想用信号机发送信息/命令。
管道将是:
- 用户点击进行操作
- Javascript(带signaler)向azure中的服务器发送消息
- 服务器将消息重新发送到特定的客户端。它必须是安装在同一台计算机上的客户端
- 一旦结果完成,NET就会发送结果反向
问题是,我如何在信号服务器中从同一台机器中找到客户端?
我们系统中的组织是:
- 有中心/健身房
- 每个中心都有可以登录的工作人员
我们可以通过一些文件配置在同一中心识别客户端。例如,保存我们的密钥中心。但是,在一个中心,可能不止一个。NET客户端安装在不同的计算机上。
我们认为使用计算机的私有IP在信号服务器上制作密钥。
var ips = [];
var RTCPeerConnection = window.RTCPeerConnection ||
window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
var pc = new RTCPeerConnection({
// Don't specify any stun/turn servers, otherwise you will
// also find your public IP addresses.
iceServers: []
});
// Add a media line, this is needed to activate candidate gathering.
pc.createDataChannel('');
// onicecandidate is triggered whenever a candidate has been found.
pc.onicecandidate = function (e) {
if (!e.candidate) { // Candidate gathering completed.
pc.close();
console.log(ips);
return;
}
var ip = /^candidate:.+ (S+) d+ typ/.exec(e.candidate.candidate)[1];
ips.push(ip);
};
pc.createOffer(function (sdp) {
pc.setLocalDescription(sdp);
}, function onerror() { });
此数据可在中获得。NET客户端没有问题。但在javascript中,前面的代码可以正常工作。在某些PC中,它只返回ipv4。在Mozilla中,它不起作用。
我们如何识别两个客户?你知道另一种达到目标的方法吗?
谢谢,
最后,我们没有找到一个好的过滤ip地址的解决方案。
我们做了如下操作:
我们使用URI架构来启动我们的应用程序。URI架构窗口
公共类注册器URI将URI_SCHEME构造为字符串="xxx"将URI_KEY构造为字符串="URL:xxx"专用共享APP_PATH为字符串=位置。AssemblyDirectory()'"C:\Program Files(x86)\xxxx.exe"公共共享子注册表UriScheme()使用hkcrClass作为RegistryKey=注册表。ClassesRoot。创建子密钥(URI_SCHEME)hkcrClass。SetValue(Nothing,URI_KEY)hkcrClass。SetValue("URL协议",[String].Empty,RegistryValueKind.[String])使用defaultIcon作为RegistryKey=hkcrClass。CreateSubKey("DefaultIcon")Dim iconValue As String=[String]。格式("{0}",0",APP_PATH)defaultIcon。SetValue(Nothing,iconValue)结束使用使用shell作为RegistryKey=hkcrClass。CreateSubKey("shell")使用open As RegistryKey=shell。CreateSubKey("打开")使用命令As RegistryKey=open。CreateSubKey("命令")Dim cmdValue As String=[String]。格式("{0}""%1",APP_PATH)命令SetValue(Nothing,cmdValue)结束使用结束使用结束使用结束使用End SubEnd Class
在Azure WebApp中,我们启动SignalR服务器。此服务器将从我们的发送数据。NET应用程序到Chrome。
为了实现这一点,当加载web时,我们连接到signalR服务器。为了构建de uri,我们将connectionId从Javascript客户端发送到。NET客户端。
然后,当本机进程完成时。NET客户端将信息发送到signalR服务器,该服务器使用connectionId将数据镜像到javascript客户端。
为了避免启动我们本机应用程序的某些实例,我们使用IPC通道将数据发送到一个实例,再发送到上一个实例并关闭新实例。
链接到源博客源