我正在制作一个电子应用程序,我需要监听本地计算机上的 TCP 端口。当我启动应用程序时,我得到: 主进程中发生 JavaScript 错误 未捕获的异常:
错误:连接 EISCONN ::1:5555 - 本地 (:ffff.127.0.0.1:5555) 在内部连接(节点:net 1067:16) 在defaultTriggerAsyncldScope(节点:内部/async_hooks:463:18) 在 GetAddrlnfoReqWrap.emitLookup [作为回调](节点:netl 324:9) 在 GetAddrlnfoReqWrap.onlookup [as oncompletel (node:dns:110:8)
这是我的代码:
//Imports
const fs = require('fs');
const net = require('net');
const path = require('node:path');
const { app, ipcMain, BrowserWindow } = require('electron');
//general variables
let settings
let mainWindow
const isMac = process.platform === 'darwin';
//create the server
let server
//window cunstructor
const createWindow = () => {
mainWindow = new BrowserWindow({
title: 'Bitburner Dashboard',
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
mainWindow.loadFile('front/index.html');
}
//wait for window to start server
ipcMain.on('mainWindow-ready', () => {
if (!fs.existsSync(path.join(__dirname, 'settings.json'))) {
fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify({
port: 5555
}), (error) => {
if (error) {
console.log(error)
}
throw error;
})
}
try {
// reading a JSON file synchronously
settings = JSON.parse(fs.readFileSync("settings.json"));
console.log(settings)
} catch (error) {
// logging the error
console.error(error);
throw error;
}
server = net.createServer(socket => {
//connect on port
socket.connect(settings.port);
socket.setKeepAlive(true);
//format data and send on recieve
socket.on("data", data => {
data = data.toString().split("\n")[17].split(",");
data = {
id: data[0],
state: data[1],
updated_at: data[2],
hostname: data[3],
admin: data[4],
level: data[5],
purchased: data[6],
connected: data[7],
backdoored: data[8],
cores: data[9],
ram: {
used: data[10],
max: data[11],
free: data[12],
trueMax: data[13]
},
power: data[14],
organisation: data[15],
isHome: data[16],
ports: {
required: data[17],
open: data[18],
ftp: data[19],
http: data[20],
smtp: data[21],
sql: data[22],
ssh: data[23]
},
security: {
level: data[24],
min: data[25]
},
money: {
available: data[26],
max: data[27],
growth: data[28]
}
};
mainWindow.webContents.send("data-recieved", data);
socket.destroy();
});
});
mainWindow.webContents.send("settings-init", settings);
server.listen(settings.port)
});
ipcMain.on('setting-update', (e, settings) => {
server.close()
server = net.createServer(socket => {
//connect on port
socket.connect(settings.port);
socket.setKeepAlive(true);
//format data and send on recieve
socket.on("data", data => {
data = data.toString().split("\n")[17].split(",");
data = {
id: data[0],
state: data[1],
updated_at: data[2],
hostname: data[3],
admin: data[4],
level: data[5],
purchased: data[6],
connected: data[7],
backdoored: data[8],
cores: data[9],
ram: {
used: data[10],
max: data[11],
free: data[12],
trueMax: data[13]
},
power: data[14],
organisation: data[15],
isHome: data[16],
ports: {
required: data[17],
open: data[18],
ftp: data[19],
http: data[20],
smtp: data[21],
sql: data[22],
ssh: data[23]
},
security: {
level: data[24],
min: data[25]
},
money: {
available: data[26],
max: data[27],
growth: data[28]
}
};
mainWindow.webContents.send("data-recieved", data);
socket.destroy();
});
});
server.listen(settings.port)
console.log(JSON.stringify(settings))
fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify(settings), (error) => {
if (error) {
console.log(error)
}
throw error;
})
})
//start app
app.on('ready', () => {
createWindow();
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
//close app
app.on('window-all-closed', () => {
if (!isMac) app.quit();
})
app.on('close', () => {
server.close()
});
我尝试在关闭时关闭服务器,但这不是问题
我弄清楚了我的问题是什么,我基本上是在 TCP 服务器上发送 http 请求。我通过更改我的服务器代码来修复它,如下所示:
let server = net.createServer(conn => {
conn.on('data', data => {
conn.write(data + '\r\n');
mainWindow.webContents.send("data-recieved", JSON.parse(data.toString().split('\n')[17]));
});
conn.on('end', () => {
});
});
完整的代码现在如下所示:
/* --------------------------------- Imports -------------------------------- */
const fs = require('fs');
const net = require('net');
const path = require('node:path');
const { app, ipcMain, BrowserWindow } = require('electron');
/* -------------------------------- variables ------------------------------- */
let settings;
let mainWindow;
const isMac = process.platform === 'darwin';
/* --------------------------------- server --------------------------------- */
let server = net.createServer(conn => {
conn.on('data', data => {
conn.write(data + '\r\n');
mainWindow.webContents.send("data-recieved", JSON.parse(data.toString().split('\n')[17]));
});
conn.on('end', () => {
});
});
/* --------------------------- window constructor --------------------------- */
const createWindow = () => {
mainWindow = new BrowserWindow({
title: 'Bitburner Dashboard',
width: 800,
height: 600,
webPreferences: {
nodeIntegration: true,
contextIsolation: true,
preload: path.join(__dirname, 'preload.js')
}
});
mainWindow.loadFile('front/index.html');
}
/* ----------------------------------- IPC ---------------------------------- */
//wait for window to start server
ipcMain.on('mainWindow-ready', () => {
//open settings
openSettings();
mainWindow.webContents.send("settings-init", settings);
server.listen(settings.port)
});
ipcMain.on('setting-update', (e, settings) => {
//close the server and start on the good port
server.close()
server.listen(settings.port)
//save the settings
fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify(settings), (error) => {
if (error) {
console.log(error)
}
throw error;
})
})
/* -------------------------------- Funcntions ------------------------------- */
//open the setting file or create one
function openSettings() {
//Check if the file exists
if (!fs.existsSync(path.join(__dirname, 'settings.json'))) {
//creates the file if it does not exist
fs.writeFileSync(path.join(__dirname, 'settings.json'), JSON.stringify({
port: 5000
}), (error) => {
if (error) {
console.error(error);
}
throw error;
});
settings = {
port: 5000
};
} else {
//Opens the file
try {
// reading a JSON file synchronously
settings = JSON.parse(fs.readFileSync("settings.json"));
} catch (error) {
if (error) {
console.error(error);
}
throw error;
}
}
}
/* ------------------------------- app routes ------------------------------- */
//start app
app.on('ready', () => {
createWindow();
//kill server when closing window
mainWindow.on('close', () => {
server.close();
})
app.on('activate', () => {
if (BrowserWindow.getAllWindows().length === 0) createWindow();
});
});
//make sure server is close on close
app.on('close', () => {
server.close();
});
//close app
app.on('window-all-closed', () => {
if (!isMac) app.quit();
})