Nextjs使用socket.io创建连接

ts支持

如果使用typescript使用新的类型将socket添加
pages/types/next.ts

/*
 * @Author: hongbin
 * @Date: 2022-11-01 21:32:16
 * @LastEditors: hongbin
 * @LastEditTime: 2022-11-01 21:32:16
 * @Description: 添加socket类型
 */
import { Server as NetServer, Socket } from "net";
import { NextApiResponse } from "next";
import { Server as SocketIOServer } from "socket.io";

export type NextApiResponseServerIO = NextApiResponse & {
    socket: Socket & {
        server: NetServer & {
            io: SocketIOServer;
        };
    };
};
服务端创建socket实例

在请求时创建socket连接
pages/api/socketio.ts

import { NextApiRequest } from "next";
import { Server as ServerIO } from "socket.io";
import { Server as NetServer } from "http";
import { NextApiResponseServerIO } from "../../src/types/next";

export const config = {
    api: {
        bodyParser: false,
    },
};

const handle = async (req: NextApiRequest, res: NextApiResponseServerIO) => {
    console.log("接受到请求");

    if (!res.socket.server.io) {
        console.log("创建服务");
        const httpServer: NetServer = res.socket.server as any;
        const io = new ServerIO(httpServer, {
            path: "/api/socketio",
        });
        //将io挂在到res上
        res.socket.server.io = io;
    }
    res.end();
};

export default handle;
客户端连接
import { io } from "socket.io-client";

const socketClient = io("http://localhost:3000/", {
 path: "/api/socketio",
    // transports: ["websocket"],
});
console.log(socketClient);
socketClient.onAny((...args) => {
    console.log(args);
});
socketClient.on("connect", () => {
    console.log("socket 连接成功");
});
socketClient.on("connect_error", (err) => {
    console.log("socket 连接err", err);
});

因为是服务端被动的创建socket连接所以第一次socket连接会失败这时服务端会创建socket连接,客户端经过短暂时间后下次轮询就会连接成功
此情况只会在项目不部署后第一位访问的用户的客户端出现之后的用户访问socket已经创建完毕,想要避免可以在请求之前手动触发服务,例如发送一个请求 fetch('http://localhost:3000/api.socketio')之后就不会在socket连接中失败(正常能够连接的情况下)
在这里插入图片描述

总结

不要用next api写socket 非常难受 热更新还有大欠缺

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Socket.IO是一个基于事件驱动的实时通信库,它可以在浏览器和服务器之间建立双向通信。而MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。 要在Socket.IO连接MQTT,可以使用一个中间件库,例如`socket.io-mqtt`。这个库可以将Socket.IO和MQTT进行桥接,使得可以通过Socket.IO来发送和接收MQTT消息。 下面是一个简单的示例代码,展示了如何使用`socket.io-mqtt`连接MQTT: 1. 首先,安装`socket.io-mqtt`库: ``` npm install socket.io-mqtt ``` 2. 在服务器端,创建一个Socket.IO服务器,并使用`socket.io-mqtt`中间件来连接MQTT: ```javascript const express = require('express'); const app = express(); const server = require('http').createServer(app); const io = require('socket.io')(server); const mqtt = require('mqtt'); const mqttClient = mqtt.connect('mqtt://localhost'); // 这里的地址需要根据实际情况修改 const socketioMqtt = require('socket.io-mqtt'); io.use(socketioMqtt(mqttClient)); io.on('connection', (socket) => { console.log('A client connected'); // 监听来自客户端的MQTT消息 socket.on('mqtt', (topic, message) => { console.log(`Received MQTT message on topic ${topic}: ${message}`); }); // 发布MQTT消息到指定主题 socket.emit('mqtt', 'myTopic', 'Hello MQTT'); }); server.listen(3000, () => { console.log('Server listening on port 3000'); }); ``` 3. 在客户端,使用Socket.IO连接到服务器,并发送和接收MQTT消息: ```javascript const socket = io('http://localhost:3000'); // 这里的地址需要根据实际情况修改 // 发送MQTT消息到服务器 socket.emit('mqtt', 'myTopic', 'Hello MQTT'); // 监听来自服务器的MQTT消息 socket.on('mqtt', (topic, message) => { console.log(`Received MQTT message on topic ${topic}: ${message}`); }); ``` 这样,通过Socket.IO和`socket.io-mqtt`中间件,就可以在浏览器和服务器之间建立起MQTT通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值