在节点js中使用套接字连接事件

Posted

技术标签:

【中文标题】在节点js中使用套接字连接事件【英文标题】:Connecting events using socket in node js 【发布时间】:2021-11-02 01:54:52 【问题描述】:

对 nodejs 非常陌生,在这里寻求帮助。 我有三个文件 index.html、server.js 和 client.js。 我创建了一个套接字来实时运行我的应用程序,即在用户输入的 id="add" 的 div 标签中显示消息。 用户在 id="element" 的输​​入字段中输入消息,当单击 id="send_data" 的按钮时应该显示消息。 任何帮助,将不胜感激。 即将用新的js开始我的新旅程。 我在客户端只使用js,根本没有任何框架 每个人甚至所有者都可以看到该消息: 这是我的代码 index.html:

    <div class="row">
        <div class="col-md-6">
                <p><input class="form-control" id="element" type="text" value="Les parties"></p>
        </div>
        <div class="col-md-6">
            <button class="btn btn-primary" id="send_data">Ajouter</button>
        </div>
    </div>
</div>
<div class="row">
    <div class="col-md-8">
        <div id="add"></div>
    </div>

这里是 server.js

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const  Server  = require("socket.io");
const io = new Server(server);



app.use(express.static(__dirname + '/public'));

app.get('/', (req, res) => 
  res.sendFile(__dirname + '/index.html');
);



io.on('connection', (socket) => 
  socket.on('message',  => 
    io.emit('message', "Hello word");
    console.log('displaying message')
  );
);

server.listen(3000, () => 
  console.log('listening on *:3000');
);

最后是client.js

let url = 'http://localhost:3000/';
 var socket = io();
 var socket = io.connect(url)
 let counter = 0;
let add = document.getElementById("add");
let element = document.getElementById("element")

 add.addEventListener('click', function(event)
    add.innerHTML = element.value;
    socket.emit('message', element.value);
 )

【问题讨论】:

【参考方案1】:

我假设根据您的代码,您需要将 client.js 放在公共文件夹中。我假设你有你的 node_modules、package.json 等等。所以在你的 public/client.js

let url = 'http://localhost:3000/';
 var socket = io();
 var socket = io.connect(url)
let add = document.getElementById("add");
let btn = document.getElementById('send_data')

 btn.addEventListener('click', function(event)
    add.innerHTML += `<li>$element.value</li>` ;
    socket.emit('message', element.value);
 )

 socket.on('message', (m) => 
    alert("message from the server: "+ m)
 )

在您的 server.js

const express = require('express');
const app = express();
const http = require('http');
const server = http.createServer(app);
const  Server  = require("socket.io");
const io = new Server(server);


app.use('/static', express.static('public'))

app.get('/', (req, res) => 
  res.sendFile(__dirname + '/index.html');
);



io.on('connection', (socket) => 
  console.log("socket connected: ", socket.id)
  socket.on('message', (message) => 
    // emit message from the server
    io.emit('message', "Hello word");
    console.log(`message $socket.id: `, message)
  );
);

server.listen(3000, () => 
  console.log('listening on *:3000');
);

在您的 index.html 中。您必须从客户端导入 socket.js。在这种情况下,您不能从 node_modules 导入它,因为它将在浏览器中运行。您可以在提供之前使用 webpack 或其他捆绑器对其进行捆绑。因为我们没有使用 webpack 来做到这一点。你需要像这样从cdn中获取它

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div class="row">
        <div class="col-md-6">
                <p><input class="form-control" id="element" onclick="me" type="text" value="Les parties" /></p>
        </div>
        <div class="col-md-6">
            <button class="btn btn-primary" id="send_data">Ajouter</button>
        </div>
    </div>
    </div>
    <div class="row">
    <div class="col-md-8">
        <div id="add-cont">
            <ul id="add"></ul>
        </div>
    </div>
</body>
</html>
<script src="https://cdn.socket.io/3.1.3/socket.io.min.js" integrity="sha384-cPwlPLvBTa3sKAgddT6krw0cJat7egBga3DJepJyrLl4Q9/5WLra3rrnMcyTyOnh" crossorigin="anonymous"></script>
<script src="./static/client.js"> </script>

【讨论】:

以上是关于在节点js中使用套接字连接事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在socket.io中的断开事件上获取断开连接的客户端的套接字ID

节点 Js 无法将消息发送到在线特定套接字

节点 Js 无法将消息发送到在线特定套接字

useEffect 中的套接字连接事件在创建组件时不起作用,但在 React 中刷新页面后起作用

为啥在 useEffect 中侦听套接字事件时对服务器有多个请求?

Socket io节点js连接问题