You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求指导:如何正确将socket.io与Laravel集成?

如何将 Socket.io 与 Laravel 正确集成

一、准备工作

  • 确保Laravel项目正常运行,PHP版本符合项目要求
  • 安装Node.js和npm/yarn,用于管理前端及Socket.io依赖

二、后端配置

1. 安装Socket.io后端依赖

在Laravel项目根目录执行命令:

npm install socket.io express cors

2. 创建Socket服务端文件

在项目根目录新建socket-server.js,写入以下代码:

const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const cors = require('cors');

const app = express();
app.use(cors({
  origin: "http://localhost:8000", // 替换为你的Laravel前端访问地址
  methods: ["GET", "POST"]
}));

const server = http.createServer(app);
const io = new Server(server, {
  cors: {
    origin: "http://localhost:8000",
    methods: ["GET", "POST"]
  }
});

io.on('connection', (socket) => {
  console.log('用户已连接:', socket.id);

  // 监听前端发送的消息事件
  socket.on('send_message', (data) => {
    console.log(data);
    // 广播消息给所有连接的客户端
    io.emit('receive_message', data);
  });

  socket.on('disconnect', () => {
    console.log('用户已断开连接:', socket.id);
  });
});

server.listen(3001, () => {
  console.log('Socket.io服务运行在http://localhost:3001');
});

3. 配置Laravel跨域规则

修改config/cors.php文件,确保允许Socket相关路径的跨域请求:

return [
    'paths' => ['api/*', 'socket.io/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['http://localhost:8000', 'http://localhost:3001'],
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,
];

4. 启动Socket服务

在项目根目录执行:

node socket-server.js

三、前端配置

1. 安装Socket.io客户端

npm install socket.io-client

2. 在Laravel视图中集成Socket.io

以resources/views/welcome.blade.php为例,添加以下代码:

<!-- 消息展示区域 -->
<div id="messagesContainer"></div>
<!-- 消息输入框和发送按钮 -->
<input type="text" id="messageInput" placeholder="输入消息">
<button id="sendBtn">发送</button>

<script type="module">
  import { io } from "socket.io-client";

  // 连接Socket服务端
  const socket = io('http://localhost:3001');

  // 监听连接成功事件
  socket.on('connect', () => {
    console.log('已连接到Socket服务端');
  });

  // 绑定发送按钮点击事件
  document.getElementById('sendBtn').addEventListener('click', () => {
    const message = document.getElementById('messageInput').value;
    if (!message) return;
    socket.emit('send_message', {
      user: '测试用户',
      message: message
    });
    document.getElementById('messageInput').value = '';
  });

  // 接收并展示广播消息
  socket.on('receive_message', (data) => {
    const messageElement = document.createElement('div');
    messageElement.textContent = `${data.user}: ${data.message}`;
    document.getElementById('messagesContainer').appendChild(messageElement);
  });

  // 监听断开连接事件
  socket.on('disconnect', () => {
    console.log('与Socket服务端断开连接');
  });
</script>

3. 编译前端资源(基于Vite)

npm run dev

四、测试验证

  1. 启动Laravel本地服务:php artisan serve
  2. 确保Socket服务处于运行状态
  3. 打开多个浏览器窗口访问Laravel站点,发送消息,验证是否能实时接收

五、常见问题排查

  • 跨域错误:检查Socket服务端和Laravel的CORS配置,确认origin地址与实际前端地址一致
  • 连接失败:确认Socket服务是否正常运行在指定端口,本地防火墙是否放行该端口
  • 事件不触发:检查前后端事件名称是否完全一致,Socket实例是否正确初始化

内容的提问来源于stack exchange,提问作者CodeCart Tech

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:37:30