Nodejs服务端与客户端c++实现socket通信,是不是客户端要自己实现socket连接,如何设置?

Nodejs服务端与客户端c++实现socket通信,是不是客户端要自己实现socket连接,如何设置?

我这个项目客户端是c++,服务端nodejs,现在通信要用socket,服务端用的是net模块,客户端c++应该怎么实现socket连接通信的封装?请有经验的人指导下

12 回复

要实现Node.js服务端与C++客户端之间的Socket通信,确实需要分别在两端实现Socket连接。以下是一个简化的步骤指南,包括如何设置和实现Socket通信。

Node.js 服务端

首先,确保你的Node.js环境已经安装了net模块(Node.js内置模块)。

  1. 创建一个简单的Node.js服务端
const net = require('net');

// 创建服务器
const server = net.createServer((socket) => {
    console.log('Client connected.');

    // 监听数据接收事件
    socket.on('data', (data) => {
        console.log(`Received: ${data.toString()}`);
    });

    // 监听客户端断开连接事件
    socket.on('end', () => {
        console.log('Client disconnected');
    });
});

// 监听错误事件
server.on('error', (err) => {
    console.error(err);
});

// 绑定到指定端口和地址
server.listen(3000, '127.0.0.1', () => {
    console.log('Server is listening on port 3000');
});

C++ 客户端

接下来,使用C++实现Socket连接。这里以Linux环境为例,使用POSIX socket API。

  1. 创建C++客户端
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>

#define SERVER_IP "127.0.0.1"
#define PORT 3000

int main() {
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock == -1) {
        perror("Socket creation failed");
        return 1;
    }

    struct sockaddr_in server_addr;
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(PORT);

    // 将IP地址字符串转换为网络地址结构
    if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0) {
        perror("Invalid address/ Address not supported");
        close(sock);
        return 1;
    }

    // 连接到服务器
    if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("Connection failed");
        close(sock);
        return 1;
    }

    std::cout << "Connected to the server" << std::endl;

    // 发送消息给服务器
    const char *message = "Hello from C++ client";
    send(sock, message, strlen(message), 0);

    // 接收服务器响应
    char buffer[1024] = {0};
    recv(sock, buffer, 1024, 0);
    std::cout << "Response from server: " << buffer << std::endl;

    // 关闭连接
    close(sock);

    return 0;
}

总结

  • 在Node.js服务端,我们使用net模块创建了一个TCP服务器。
  • 在C++客户端,我们使用POSIX socket API实现了TCP客户端,包括连接到服务器、发送和接收数据。

这样,你就可以实现Node.js服务端与C++客户端之间的Socket通信。


我之前做过nodejs与C之间的socket通信,由于是比较底层的通信了,所以肯定要在两边实现通信协议。如果用的是现成的协议,可以看看有没有合适的工具包来辅助。

服务端我用的现成的net模块,因为他封装的比较完善,现在问题是net模块的协议不知道具体是怎么定义的,有资料介绍这块没?

不就是基本的TCP协议么。C++里有相关的库吧

在做类似的东西,服务器端是vc++,客户端是nodejs,用的net模块TCP连接。但是毕竟两边的接口差异比较大,数据交互始终处理不好啊。。。同求指导

只用flash做过socket通信的例子,应该差不多的,flash发起长连接,采用私有协议进行通讯

boost.asio

和使用什么模块应该关系不大才对吧。 都是socket通信,就是三次握手,监听端口,然后发起连接,连接成功,发送接收数据。基于TCP/UDP的端口通信。

不太明白你说的封装是什么意思~C++和net.socket的通信很简单,服务端简单几行代码就可以通信了。你说的是如何封装通信协议吧,协议的封装可以使用简单的长度+包体+验证的结构服务端和对端使用同样的方法和编码格式去解析~是不是你想知道的-.-

加一个google v8库进去,也用js写

服务端开启一个端口监听。 客户端连接服务端的监听端口。 服务端开启一个端口和客户端进行数据交换。 客户端关闭端口。

要实现 Node.js 服务端与 C++ 客户端之间的 Socket 通信,确实需要分别在两端实现 Socket 连接。具体来说,Node.js 服务端使用 net 模块来监听和处理客户端的连接,而 C++ 客户端则需要使用相应的库(如 Boost.Asio)来建立和管理 Socket 连接。

示例代码

Node.js 服务端代码

const net = require('net');

const server = net.createServer((socket) => {
    console.log("客户端已连接");

    socket.on('data', (data) => {
        console.log(`收到数据: ${data.toString()}`);
    });

    socket.on('end', () => {
        console.log("客户端断开连接");
    });
});

server.listen(3000, () => {
    console.log("服务器启动,监听端口3000");
});

C++ 客户端代码(使用 Boost.Asio)

首先确保你已经安装了 Boost 库,并配置好了 Boost.Asio。

#include <boost/asio.hpp>
#include <iostream>
#include <string>

using boost::asio::ip::tcp;

int main() {
    try {
        boost::asio::io_context io_context;

        // 解析服务器地址和端口
        tcp::resolver resolver(io_context);
        auto endpoints = resolver.resolve("localhost", "3000");

        // 创建Socket并连接到服务器
        tcp::socket socket(io_context);
        boost::asio::connect(socket, endpoints);

        std::string message = "Hello from C++ client!";
        boost::asio::write(socket, boost::asio::buffer(message));

        char reply[1024];
        size_t length = boost::asio::read(socket, boost::asio::buffer(reply));
        std::cout << "接收消息: " << std::string(reply, length) << std::endl;

    } catch (std::exception& e) {
        std::cerr << "异常: " << e.what() << std::endl;
    }

    return 0;
}

代码说明

  1. Node.js 服务端

    • 使用 net.createServer 创建一个 TCP 服务器。
    • 监听指定端口(本例中为 3000)。
    • 处理客户端的数据接收、结束事件。
  2. C++ 客户端

    • 使用 Boost.Asio 来创建和管理 Socket 连接。
    • 解析目标服务器地址和端口。
    • 建立连接后发送消息,并接收服务器的响应。

通过这种方式,可以实现 Node.js 服务端与 C++ 客户端之间的 Socket 通信。确保两端正确解析地址和端口,并妥善处理连接的建立和关闭。

回到顶部