Node.js 电子:socket.io可以接收但不能发射

Node.js 电子:socket.io可以接收但不能发射,node.js,socket.io,electron,Node.js,Socket.io,Electron,我正在创建一个Electron应用程序,它使用Socket.io与服务器应用程序通信,但我遇到了一个奇怪的问题:尽管我的Electron应用程序成功地加入并接收来自服务器的消息,但它完全无法发出任何信息 客户端: const io = require('socket.io-client'); // ... var socket = io("http://localhost:8081"); socket.on('welcome', () => { console.log('welcom

我正在创建一个Electron应用程序,它使用Socket.io与服务器应用程序通信,但我遇到了一个奇怪的问题:尽管我的Electron应用程序成功地加入并接收来自服务器的消息,但它完全无法发出任何信息

客户端:

const io = require('socket.io-client');
// ...
var socket = io("http://localhost:8081");

socket.on('welcome', () => {
  console.log('welcome received'); // displayed
  socket.emit('test')
});
socket.on('error', (e) => {
  console.log(e); // not displayed
});
socket.on('ok', () => {
  console.log("OK received"); // not displayed
});
socket.on('connect', () => {
  console.log("connected"); // displayed
  socket.emit('test');
});
io.on('connection', (client) => {
  io.emit('welcome');

  client.on("test", () => {
      console.log("received test"); // not displayed
      io.emit("ok");
  })
});
io.listen(8081);
服务器端:

const io = require('socket.io-client');
// ...
var socket = io("http://localhost:8081");

socket.on('welcome', () => {
  console.log('welcome received'); // displayed
  socket.emit('test')
});
socket.on('error', (e) => {
  console.log(e); // not displayed
});
socket.on('ok', () => {
  console.log("OK received"); // not displayed
});
socket.on('connect', () => {
  console.log("connected"); // displayed
  socket.emit('test');
});
io.on('connection', (client) => {
  io.emit('welcome');

  client.on("test", () => {
      console.log("received test"); // not displayed
      io.emit("ok");
  })
});
io.listen(8081);
请注意,还有一个Web客户端连接到服务器,并且完全按照预期工作


我做错了什么?

Electron的主进程可以进行节点集成,渲染器进程出于安全原因默认关闭

如果您尝试在主进程(main.js)中使用客户端代码,它将正常工作并接收/发出。但是如果您尝试在呈现的进程上使用客户机代码,那么它将无法工作。您需要在
preload.js
中添加客户端代码,然后使用
BrowserWindow
的选项进行预加载,如下所示:

函数createWindow(){
//创建浏览器窗口。
主窗口=新浏览器窗口({
宽度:800,
身高:600,
网络首选项:{
preload:path.join(uu dirname,'preload.js')
}
})
//并加载应用程序的index.html。
mainWindow.loadFile('index.html')
...
}
然后您可以将客户端代码放在
preload.js
中:

const io=require('socket.io客户端');
常量套接字=io(`http://localhost:${process.env.SOCKET_PORT}`);
socket.on('欢迎',()=>{
log('on welcome:welcome received renderer');//显示
socket.emit('test')
});
socket.on('错误',(e)=>{
console.log(e);//是否显示?
});
socket.on('ok',()=>{
console.log(“OK received renderer”);//显示
});
socket.on('connect',()=>{
console.log(“已连接的渲染器”);//显示
socket.emit('test');
});
启动插座,启动electron应用程序并查看其工作情况:

套接字服务器:

应用程序控制台:

请注意:

为了避免这种情况,您必须将WS-server添加到CSP中。对于本地主机,请在
index.html
标题中使用以下内容:

<meta http-equiv="Content-Security-Policy" content="default-src 'self' ws://localhost:*/socket.io/; script-src 'self' ws://localhost:*/socket.io/">
<meta http-equiv="X-Content-Security-Policy" content="default-src 'self' ws://localhost:*/socket.io/; script-src 'self' ws://localhost:*/socket.io/">

你的socket.io代码是否在electron环境下工作,我也遇到了同样的情况我的socket与express的web配合良好,但与electronI不配合我无法找到解决此问题的任何方法,因此我最终摆脱了此问题,并使用了基于REST API的(肮脏的)解决方法…:(客户端控制台中出现了什么类型的错误?使用git或提供服务器和客户端的代码。在这里,我可以复制它。很抱歉,几个月前我就遇到了这个问题,我无法再访问应用程序代码,因为我不再在我编写应用程序代码的公司工作。谢谢你的回答!我在悬赏我提出了这个问题,但管理员删除了它…天知道为什么。所以,如果你能在这里看到相同的问题,并添加了详细信息,那将不胜感激!@lamisti我对你原来的问题发表了评论。请分享你正在使用的电子版本。