postMessage 方法进行通信实例代码
时间: 2023-10-27 11:27:42 浏览: 50
下面是一个简单的示例代码,展示如何使用 postMessage 方法进行跨窗口通信:
在发送消息的窗口中:
```javascript
// 获取接收消息窗口的引用
const receiverWindow = window.opener || window.parent;
// 发送消息
receiverWindow.postMessage("Hello, receiver!", "https://www.receiver.com");
```
在接收消息的窗口中:
```javascript
// 监听消息事件
window.addEventListener("message", event => {
// 如果消息来源不是指定的发送消息窗口,则忽略该消息
if (event.origin !== "https://www.sender.com") {
return;
}
// 处理接收到的消息
console.log(`Received message: ${event.data}`);
});
```
在上面的示例中,发送消息的窗口使用 `postMessage` 方法将消息发送给指定的接收消息窗口。接收消息的窗口通过监听 `message` 事件来接收消息,然后根据消息来源和内容进行处理。注意在实际使用中需要根据具体情况进行安全性检查和错误处理。
相关问题
vue require('zeromq')前端代码实例
在前端代码中使用 `require('zeromq')` 可能会导致界面卡顿,因此不建议在前端直接使用 `require` 引入 `zeromq` 模块。如果需要在前端与 ZeroMQ 进行通信,可以考虑使用 WebSocket 进行通信,或者通过接口调用后端服务进行通信,具体操作步骤如下:
1. 在后端代码中,使用 `zeromq` 模块创建一个 ZeroMQ 的套接字并进行通信,可以参考上一篇回答中的示例代码。
2. 在后端代码中,提供一个接口用于处理前端请求,并将请求转发到 ZeroMQ 套接字中,代码如下:
```javascript
const zmq = require('zeromq');
const express = require('express');
const bodyParser = require('body-parser');
// 创建一个 REP 类型的套接字
const socket = zmq.socket('rep');
// 监听端口并接受连接请求
socket.bindSync('tcp://127.0.0.1:3000');
// 处理请求并返回响应
socket.on('message', (request) => {
console.log(`Received request: ${request.toString()}`);
// 处理请求并返回响应
const response = 'Hello, World!';
socket.send(response);
});
// 创建一个 Express 应用
const app = express();
// 解析请求体
app.use(bodyParser.json());
// 处理前端请求并将请求转发到 ZeroMQ 套接字中
app.post('/api', (req, res) => {
console.log(`Received request from frontend: ${JSON.stringify(req.body)}`);
// 将请求发送到 ZeroMQ 套接字中
socket.send(req.body.message);
// 等待套接字返回响应
socket.on('message', (response) => {
console.log(`Received response from ZeroMQ: ${response.toString()}`);
res.json({ message: response.toString() });
});
});
// 启动 Express 应用
app.listen(8080, () => {
console.log('Server started on port 8080');
});
```
上面的代码中,我们创建了一个 `REP` 类型的套接字,并将其绑定到 `127.0.0.1:3000` 地址上。然后创建了一个 Express 应用,并在其中定义了一个 `/api` 接口,用于接收前端请求并将请求发送到 ZeroMQ 套接字中。当 ZeroMQ 套接字返回响应时,将响应返回给前端。
3. 在 Vue 组件中,使用 `axios` 或者其他 HTTP 客户端库,向刚才启动的 Express 应用发送请求,代码如下:
```javascript
methods: {
async sendMessage() {
const message = 'Hello, ZeroMQ!';
const response = await axios.post('/api', { message });
console.log(response.data);
},
},
```
上面的代码中,我们在 Vue 组件的 `sendMessage` 方法中使用了 `axios` 库发送了一个 POST 请求到 `/api` 接口,并将消息内容作为请求体发送。当接口返回响应时,将响应数据打印到控制台。
4. 在 Vue 组件中,将 `sendMessage` 方法绑定到某个按钮的点击事件上,实现用户点击按钮时发送消息到 ZeroMQ 套接字中,代码如下:
```html
<template>
<div>
<button @click="sendMessage">Send Message</button>
</div>
</template>
<script>
import axios from 'axios';
export default {
methods: {
async sendMessage() {
const message = 'Hello, ZeroMQ!';
const response = await axios.post('/api', { message });
console.log(response.data);
},
},
};
</script>
```
上面的代码中,我们在模板中添加了一个按钮,并将 `sendMessage` 方法绑定到按钮的点击事件上。
以上就是在 Vue 中通过接口调用后端服务与 ZeroMQ 进行通信的基本操作步骤。需要注意的是,在实际开发中,我们需要根据具体的业务需求来修改上面的代码。
okhttp android socket 框架实例 带发送消息的方法
以下是一个使用 OkHttp 实现 Socket 通信的示例代码:
```java
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okio.BufferedSink;
public class SocketClient {
private static final String HOST = "example.com"; // 服务器地址
private static final int PORT = 12345; // 服务器端口号
private static final MediaType MEDIA_TYPE_PLAIN_TEXT = MediaType.parse("text/plain");
private OkHttpClient client;
private Socket socket;
private BufferedSink sink;
public void connect() throws IOException {
client = new OkHttpClient();
socket = new Socket();
socket.connect(new InetSocketAddress(HOST, PORT), 5000); // 连接超时时间为 5 秒
sink = Okio.buffer(Okio.sink(socket));
}
public void disconnect() throws IOException {
socket.close();
}
public void send(String message) throws IOException {
sink.writeUtf8(message);
sink.flush();
}
public String receive() throws IOException {
Request request = new Request.Builder()
.url("http://" + HOST + ":" + PORT)
.post(RequestBody.create(MEDIA_TYPE_PLAIN_TEXT, ""))
.build();
Response response = client.newCall(request).execute();
ResponseBody body = response.body();
if (body == null) {
return null;
}
return body.string();
}
}
```
在上面的代码中,我们使用 OkHttp 的 `OkHttpClient` 类来发送 HTTP POST 请求,以接收服务器发送的消息。`send` 方法使用 Okio 的 `BufferedSink` 类将消息写入 Socket 连接。使用时需要注意在合适的时机调用 `connect` 方法连接服务器,并在不需要连接时调用 `disconnect` 方法断开连接。