- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经在 Google 和 SO 上搜索了几周,以解决这个一直困扰我的问题。我将首先概述我的目标是什么,然后我将尝试解释我已经接近解决它了。
在大型应用程序及其数据 API 之间注入(inject)一个小型 express
服务器,其唯一目的是操纵来自服务器的数据响应(或策划自定义响应来代替服务器响应的响应)。
我们正在使用 socket.io
将客户端与服务器连接,实际上我真正想要修改的事件很少。我想在客户端和服务器之间来回代理大多数事件而不进行修改。
但是,我希望将一些宝贵的事件发送回客户端以进行测试
我尝试将基本的 Express 服务器设置为 socket.io-client
和 socket.io
服务器。不过,我不知道如何将我的请求代理给彼此,并且特别担心跟踪多个客户端的可能性。这里的链接是关键,我被难住了
我也尝试过使用 http-proxy这已经让我非常接近了,但是到目前为止,我唯一能做的就是使用 socket.on('data', (data) => {/* do some */});
在我的 proxy.on('open', socket => {});
事件中检查有效负载的来去。
因此,虽然我可以看到大量数据来来去去,但我仍然需要有机会操纵它。
这是以前有人做过的事情吗?是否有关于如何通过将客户端连接连接到服务器来使 Express 服务器充当代理的良好资源?
预先感谢您的专业知识。我担心这可能有点太先进了。
最佳答案
好吧,正如我所 promise 的,我想出了一半的理想解决方案。理想情况下,我想来回代理所有事件,并且只监听几个关键事件,但我还没有弄清楚这一部分。如果有人能在这方面帮助我,我将永远感激不已。
相反,我只是映射出套接字每一端发出的所有事件并将它们隐藏在连接的调用中。
以下是我如何实现我想要的效果的具体细节 - 您照常创建一个服务器
,然后在其连接上,从内部启动一个客户端
连接.on('connection', () => {});
调用。一旦进入此范围,您就可以相对确定两个连接都已打开,并开始来回传递事件。理想情况下,您会检查事件连接,但如果您的服务器和/或客户端能够处理断开的连接,则可能没问题。
您将在下面的简单示例中看到我如何来回传递事件,并完成工作。就像我说的,如果有人可以帮助我使用类似通配符的方法(由于某种原因我无法工作),请告诉我!
// GLOBAL CONFIGS
const serverConfig = {}; // Feel free to add your desired options here
// Some of these options pertain more to me than they will to you; don't feel like
// you have to copy these configs
const clientConfig = {
// We don't want to pre-emptivly try to connect to data-api,
// because we need our client to give us data first.
autoConnect: false,
multiplex: false,
// Disables/bypasses long polling which causes the connection to
// be severed then re-connected (for my api at least)
transports: ["websocket"]
};
const PORT = 3000;
const PROXY_HOST = '<api-endpoint-goes-here>'
const NAMESPACE = '<the name of your namespace, if applicable>';
// SERVER STUFF - this will connect to your client
const app = require('express')();
const server = require('http').Server(app);
const cors = require('cors');
const io = require('socket.io')(server, serverConfig);
const nsp = io.of(`/${NAMESPACE}`);
// CLIENT STUFF - this will connect to your api server as a client
const client = require('socket.io-client');
const ioClient = client(`${PROXY_HOST}/${NAMESPACE}`, clientConfig);
// Self explanatory I hope
app.use(cors());
// I am going to call this a root socket - meaning no namespace. Not entirely useful for now unless
// we want to inspect transitions in and out of our namespace, but just putting it here FYI
io.on('connection', socket => {
console.log(`A connection to the root socket made ${socket.handshake.headers.origin}`);
socket.on('disconnect', () => {
console.log(`A client disconnected from the root socket.`);
});
});
// Serve up a basic html file so that we can interact with our socket.io instance in the
// console. This index.html has a similar setup with a socket connection to both the data
// api and this test server, so I can ping events via console and test how this is working
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname + '/index.html'));
});
// Run the server
server.listen(PORT, () => console.log('Test data server is running'));
// Here's where the real solution reveals itself for me :)
// Listen for connections to the namespace we are looking for - this is the meat & potatoes of our app
nsp.on('connection', socket => {
console.log(`the ${NAMESPACE} namespace was connected`);
// Time to initiate a connection to the ioClient because we need it for the app now
ioClient.connect();
// Now check to make sure ioCLient is connected. Once we get inside here, we can be
// reasonably sure that we have a connection to both the client, and the data-api
ioClient.on('connect', () => {
// Acknowledge we have connected to the data-api
console.log('Connected to data-api via socket.io');
// Events sent from data-api
ioClient.on('<your event>', data => {
socket.emit('<your event>', data);
});
ioClient.on('<your event with two params>', (data1, data2) => {
socket.emit('<your event with two params>', data1, data2);
});
// ... etc
// Other event catchers for ioClient
ioClient.on('disconnect', () => {
console.log('Disconnected from the data-api');
});
ioClient.on('error', err => {
console.error('Error with the data-api connection: ', err);
});
// Events sent from the app client
socket.on('<your event>', data => {
ioClient.emit('<your event>', data);
});
socket.on('<your event with two params>', (data1, data2) => {
ioClient.emit('<your event with two params>', data1, data2);
});
// ... etc
});
});
关于javascript - 如何通过代理或作为中间件来操作 socket.io 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53937188/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!