Electron项目使用Socket通讯

Electron项目使用Socket通讯

服务端

在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

客户端渲染进程调用主进程发送消息与服务端类似,请参考服务端。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值