Nodejs怎么做服务接口?是不是只能用socket.io?

Nodejs怎么做服务接口?是不是只能用socket.io?

我现在需要提供一个接口,查询当前在线的PC机(能PING得通),然后把它们返回给客户端,客户端根据我给的返回值在页面上把在线的PC机相应的图标点亮。 由于我之前用socket.io做了即时在线聊天的功能,所以只能想到用SOCKET.IO来实现。 客户端调用我提供的一个JS接口,然后socket.emit发送一个消息给服务端,服务端处理以后,然后再socket.emit到客户端,客户端socket.on接受到返回结果。 现在我是这样实现的,不知道客户端能不能直接调用到服务端的方法?或者有其他更好的方法呢?

8 回复

当然不是只有使用 socket.io 才能实现服务接口。在 Node.js 中,你可以选择多种方式来创建服务接口,包括但不限于 HTTP 服务器、Express 框架、WebSocket 等。下面是一个简单的例子,展示如何使用 Express 框架来创建一个服务接口,并实现你所描述的功能。

使用 Express 创建服务接口

首先,确保你已经安装了必要的依赖包:

npm install express os-ping

接下来,创建一个简单的 Express 应用来实现你的需求:

const express = require('express');
const ping = require('os-ping');

const app = express();
const PORT = 3000;

app.get('/online-pcs', async (req, res) => {
    const pcs = req.query.pcs.split(',');
    
    let onlinePcs = [];
    for (let pc of pcs) {
        if (await ping.promise.probe(pc)) {
            onlinePcs.push(pc);
        }
    }

    res.json(onlinePcs);
});

app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});

客户端调用

客户端可以通过简单的 AJAX 请求来调用这个服务接口:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Online PCs</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<button id="check">Check Online PCs</button>
<div id="result"></div>

<script>
$(document).ready(function() {
    $('#check').click(async function() {
        const pcs = 'pc1,pc2,pc3'; // 这里可以动态获取 PC 列表
        const response = await $.getJSON(`/online-pcs?pcs=${pcs}`);
        $('#result').text(`Online PCs: ${response.join(', ')}`);
    });
});
</script>
</body>
</html>

解释

  1. 服务端

    • 使用 Express 创建一个简单的 HTTP 服务器。
    • /online-pcs 路由接收一个包含 PC 地址的查询参数,通过 os-ping 模块检查每个 PC 是否在线,并将在线的 PC 返回给客户端。
  2. 客户端

    • 使用 jQuery 发送一个 GET 请求到 /online-pcs,并根据返回的结果更新页面上的显示。

这种方式不仅简单,而且不需要复杂的 WebSocket 实现。如果你的应用场景中确实需要实时通信功能,再考虑使用 socket.io 也不迟。


.net 模块。 自写协议。[(´▽` )我是来逗你的]

将ping结果返回到客户端不难。使用node.js使用ping要么自己实现icmp协方式或使用已经有的包,或者调用操作系统的ping命令

集中化运维么?

不是啊

这个用socket这种长TCP链接好像是浪费资源啊。 把这个功能在服务器端封装成RESTful API,在客户端一个ajax调用就OK了。 估计你没有用过上层一点的框架是吧?给你推荐个MEAN.JS,你的这个小功能分分钟搞定。

谢谢啊,我来试试。

使用Node.js创建服务接口并不局限于使用socket.io。你可以使用更常见的HTTP协议来实现这一功能。socket.io主要用于实时通信,而你的需求更像是一个HTTP请求响应模式。你可以使用Express框架来快速搭建一个RESTful API。

示例代码

首先,确保你已经安装了express库:

npm install express

接下来,创建一个简单的Express应用来处理客户端的请求:

const express = require('express');
const app = express();
const port = 3000;

// 模拟的数据源
const onlineMachines = [
    { ip: '192.168.1.1', name: 'Machine1' },
    { ip: '192.168.1.2', name: 'Machine2' }
];

// 假设的ping函数
function ping(ip) {
    // 这里可以用一些库如"ping"或"child_process"来执行系统命令实现
    return new Promise(resolve => {
        setTimeout(() => resolve(Math.random() > 0.5), 500); // 随机模拟在线状态
    });
}

app.get('/online-machines', async (req, res) => {
    const onlineList = [];
    for (const machine of onlineMachines) {
        if (await ping(machine.ip)) {
            onlineList.push(machine);
        }
    }
    res.json(onlineList);
});

app.listen(port, () => {
    console.log(`Server running at http://localhost:${port}`);
});

在这个例子中,我们创建了一个GET路由/online-machines,它会检查所有预定义的机器是否在线,并返回在线机器的列表。你可以通过发送HTTP GET请求到这个地址来获取在线机器的信息。

客户端调用

客户端可以使用JavaScript的fetchaxios等库来调用这个API:

fetch('http://localhost:3000/online-machines')
    .then(response => response.json())
    .then(data => {
        console.log(data);
        // 更新页面显示
    });

这种方式比使用socket.io更简单,也更适合你的需求。如果你确实需要双向通信或实时更新,那么socket.io仍然是一个很好的选择。但在这种情况下,HTTP请求足以满足你的需求。

回到顶部