服务端
在main>index.ts中开户服务端监听
import { app, BrowserWindow, ipcMain, shell } from 'electron';
import net from 'net'
import logger from '../../src/util/logger';
const HOST = '127.0.0.1'
const PORT = 53868
const server = net.createServer()
// 记录客户端列表
let clientMap = new Map();
server.listen(PORT, HOST)
// 当建立链接时,得到客户端socket对象
server.on('connection', (socket) => {
// 远程客户端地址,打印到日志文件中
logger.info(`connected:${socket.remoteAddress}:${socket.remotePort}`)
// 设置编码格式
socket.setEncoding('utf-8')
// 放入列表
clientMap.set(socket, socket);
logger.info('当前连接客户端数量:' + clientMap.size)
// 向客户端发送数据
socket.write('服:你好客户端')
// 收到客户端数据时
socket.on('data', (data) => {
logger.info('接收到客户端消息:【'+ `${data}`+"】");
// 定义接收到消息的事件处理
// 。。。。
})
// 客户端主动断连,触发end事件
socket.on('end', () => {
clientMap.delete(socket)
logger.warn(`客户端${socket.remoteAddress}:${socket.remotePort}已断连`);
})
// 为这个socket实例添加一个"close"事件处理函数
socket.on('close', function (data) {
clientMap.delete(socket)
logger.warn('CLOSED: ' + socket.remoteAddress + ' ' + socket.remotePort)
})
// 客户端异常断开时触发
socket.on('error', (ex) => {
clientMap.delete(socket)
logger.error('客户端异常断开,错误信息:')
logger.error(ex.message)
})
})
// 服务端异常时触发
server.on('error', (ex) => {
logger.error('服务端异常,错误信息:')
logger.error(ex.message)
})
logger.info(`server listen on ${HOST}:${PORT}`)
console.log(`server listen on ${HOST}:${PORT}`)
})
接收渲染进程事件向客户端发送消息
//
ipcMain.on('sync-sendsocketmessage', (event, arg) => {
//logger.info(arg);
logger.info('------------------调用socket发送消息-------------------')
if (clientMap.size > 0) {
logger.info(JSON.stringify(arg));
clientMap.forEach((item) => {
item.write(JSON.stringify(arg))
})
event.returnValue = 'success'
} else {
logger.error("socket客户端未连接");
event.returnValue = 'error'
}
logger.info('------------------socket消息发送结束-------------------')
渲染进程调用主进程向客户端发送消息
const send = (message: any) => {
let replayMessage = ipcRenderer.sendSync('sync-sendsocketmessage', message)
if (replayMessage === 'success') {
ElMessage.success('发送成功.')
} else if (replayMessage === 'error') {
ElMessage.error('发送失败.')
}
}
客户端
定义client.ts, 然后在main>index.ts中引入
// client.ts
import net from 'net'
import logger from './logger'
const HOST = '127.0.0.1'
const PORT = 53868
const client = new net.Socket()
// 发起连接
client.connect(PORT, HOST, () => {
logger.info(`connected to:${HOST}:${PORT}`)
})
// 向服务端发送数据
client.write('客:你好服务端')
// 收到服务端数据时
client.on('data', (data) => {
logger.info("收到消息:【" +data.toString()+ "】")
// 回应服务端消息
client.write('客:已收到')
})
// 客户端主动断连,触发自己的end事件
client.on('end', () => {
logger.info("链接已主动断开")
// 断开重连
setTimeout(() => {
client.connect(PORT, HOST, () => {
console.log(`retry connected to:${HOST}:${PORT}`)
})
}, 5000)
})
// 连接超时
client.on('timeout', () => {
console.log(`output->超时:`)
})
// 发生异常时触发
client.on('error', (ex) => {
logger.error("连接出现异常:" + ex)
// 重连
setTimeout(() => {
client.connect(PORT, HOST, () => {
console.log(`connected to:${HOST}:${PORT}`)
logger.info(`retry connected to:${HOST}:${PORT}`)
})
}, 5000)
})
export default client
客户端渲染进程调用主进程发送消息与服务端类似,请参考服务端。