如何通过Node.js WebSocket实现网页与C语言Server.exe的连接?
嘿,既然你有多年JavaScript经验,上手Node.js真的没那么难!咱们一步步拆解这个需求,很快就能搞定:
核心架构思路
首先明确整个链路:你的网页(从http://10.211.55.8/edu-connect/gate.php打开)会先连接到Node.js的WebSocket服务,再由Node.js服务作为中间桥接,去连接PC_1上的Server.exe(10.211.55.10:15842),实现网页与C语言服务端的双向通信。
步骤1:搭建Node.js环境
先在PC_2(或者任意能同时访问PC_1和网页的机器)上安装Node.js,装好后打开终端输入以下命令确认安装成功:
node -v npm -v
步骤2:创建Node.js WebSocket-TCP转发服务
这个服务的作用是把网页的WebSocket消息转成TCP协议发给C服务端,再把C服务端的TCP消息转成WebSocket发给网页。
- 新建一个文件夹(比如
ws-tcp-bridge),打开终端进入该文件夹,执行:
npm init -y npm install ws
这里ws是Node.js生态中最常用的WebSocket库,net是Node.js内置的TCP模块,不用额外安装。
- 在文件夹里创建
bridge.js文件,写入以下代码:
const WebSocket = require('ws'); const net = require('net'); // 启动WebSocket服务,监听端口设为8080(可自行修改) const wss = new WebSocket.Server({ port: 8080 }); wss.on('connection', (ws) => { console.log('网页客户端已连接'); // 连接到PC_1的C语言服务端 const tcpClient = net.connect({ host: '10.211.55.10', port: 15842 }); // 转发网页消息到C服务端 ws.on('message', (message) => { tcpClient.write(message); }); // 转发C服务端消息到网页 tcpClient.on('data', (data) => { // 如果C服务端用二进制协议,直接去掉toString()发送原始数据即可 ws.send(data.toString()); }); // 处理断开连接的清理逻辑 ws.on('close', () => { console.log('网页客户端已断开'); tcpClient.end(); }); tcpClient.on('error', (err) => { console.error('连接C服务端出错:', err); ws.close(); }); }); console.log('Node.js WebSocket转发服务已启动,监听端口8080');
步骤3:启动Node.js服务
在终端里进入ws-tcp-bridge文件夹,执行:
node bridge.js
看到输出Node.js WebSocket转发服务已启动,监听端口8080就说明服务正常运行了。
步骤4:修改gate.php页面,添加WebSocket客户端代码
在你的gate.php页面中插入一段JavaScript代码,让网页连接到Node.js的WebSocket服务:
<script> // 替换为Node.js服务所在机器的IP和端口 const ws = new WebSocket('ws://10.211.55.8:8080'); // 连接成功后的回调 ws.onopen = () => { console.log('已连接到Node.js WebSocket服务'); // 可在这里发送测试消息给C服务端 ws.send('Hello from web client!'); }; // 接收C服务端消息的回调 ws.onmessage = (event) => { console.log('收到C服务端消息:', event.data); // 这里可以把消息展示在网页上,比如更新DOM }; // 连接关闭的回调 ws.onclose = () => { console.log('WebSocket连接已关闭'); }; // 错误处理 ws.onerror = (error) => { console.error('WebSocket连接出错:', error); }; </script>
关键注意事项
- 确保PC_1的15842端口、Node.js服务的8080端口都没有被防火墙拦截,能正常互相访问。
- 如果你的
Server.exe使用的是二进制通信协议,把Node.js代码里的data.toString()改成直接发送data即可(WebSocket原生支持二进制帧)。 - 因为你有JS基础,这段代码逻辑其实很简单:就是做一个消息转发器,把两边的消息互相转递而已。
内容的提问来源于stack exchange,提问作者user9431147




