鸿蒙Next中socket-tcp的napi如何使用

在鸿蒙Next开发中,使用napi实现socket-tcp通信时遇到几个问题:

  1. 如何正确引入napi相关头文件和依赖库?
  2. socket的创建、绑定和监听流程与标准Linux环境有何差异?
  3. 是否有完整的napi封装示例代码可以参考?
  4. 数据传输过程中出现ECONNRESET错误该如何排查?
  5. 如何通过napi实现异步回调接收数据?希望有实际案例说明。
2 回复

鸿蒙Next的napi玩转TCP?简单说就是:先napi_create_tcp_socket造个插座,再napi_tcp_connect连线。发数据用napi_send,收数据用napi_recv,记得处理回调别让线程饿死。最后napi_close_socket关闸,完美!代码别忘加错误检查,不然bug会像没关的冰箱门——冷场!

更多关于鸿蒙Next中socket-tcp的napi如何使用的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next中,使用NAPI开发TCP Socket通信主要涉及以下步骤:

1. 创建TCP客户端

#include <napi/native_api.h>
#include <arpa/inet.h>
#include <sys/socket.h>

static napi_value CreateTcpClient(napi_env env, napi_callback_info info) {
    // 创建socket
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (client_fd < 0) {
        napi_throw_error(env, NULL, "Socket creation failed");
        return nullptr;
    }
    
    // 设置服务器地址
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr);
    
    // 连接服务器
    if (connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        close(client_fd);
        napi_throw_error(env, NULL, "Connection failed");
        return nullptr;
    }
    
    // 返回socket文件描述符给JS
    napi_value result;
    napi_create_int32(env, client_fd, &result);
    return result;
}

2. 发送数据

static napi_value SendData(napi_env env, napi_callback_info info) {
    size_t argc = 2;
    napi_value args[2];
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    
    // 获取socket fd和数据
    int client_fd;
    napi_get_value_int32(env, args[0], &client_fd);
    
    char buffer[1024];
    size_t str_len;
    napi_get_value_string_utf8(env, args[1], buffer, sizeof(buffer), &str_len);
    
    // 发送数据
    ssize_t sent = send(client_fd, buffer, str_len, 0);
    
    napi_value result;
    napi_create_int32(env, sent, &result);
    return result;
}

3. 接收数据

static napi_value ReceiveData(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value args[1];
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    
    int client_fd;
    napi_get_value_int32(env, args[0], &client_fd);
    
    char buffer[1024];
    ssize_t received = recv(client_fd, buffer, sizeof(buffer)-1, 0);
    
    if (received > 0) {
        buffer[received] = '\0';
        napi_value result;
        napi_create_string_utf8(env, buffer, NAPI_AUTO_LENGTH, &result);
        return result;
    }
    
    return nullptr;
}

4. 注册模块

static napi_value Init(napi_env env, napi_value exports) {
    napi_property_descriptor desc[] = {
        {"createTcpClient", nullptr, CreateTcpClient, nullptr, nullptr, nullptr, napi_default, nullptr},
        {"sendData", nullptr, SendData, nullptr, nullptr, nullptr, napi_default, nullptr},
        {"receiveData", nullptr, ReceiveData, nullptr, nullptr, nullptr, napi_default, nullptr}
    };
    
    napi_define_properties(env, exports, sizeof(desc)/sizeof(desc[0]), desc);
    return exports;
}

NAPI_MODULE(tcp_module, Init)

5. JS端使用

import tcp from 'libtcp_module.so';

// 创建客户端
let clientFd = tcp.createTcpClient();

// 发送数据
tcp.sendData(clientFd, "Hello Server");

// 接收数据
let response = tcp.receiveData(clientFd);

注意事项:

  • 需要添加网络权限:ohos.permission.INTERNET
  • 错误处理要完善,特别是socket操作可能失败的情况
  • 大数据传输需要分片处理
  • 实际使用时建议使用异步操作避免阻塞

这就是鸿蒙Next中使用NAPI开发TCP Socket的基本方法。

回到顶部