更新记录

1.0.0(2026-07-22)

  • 新增 Android、iOS 原生 TCP 客户端。
  • 新增 TCP 服务端监听和多客户端管理。
  • 新增 UDP 绑定、单播和广播。
  • 新增 UTF-8 文本与 Base64 二进制收发。
  • 新增连接超时、keep-alive、TCP_NODELAY、地址复用和自动重连配置。
  • 新增完整连接状态和错误事件。

平台兼容性

uni-app x(3.8.0)

Chrome Safari Android Android插件版本 iOS iOS插件版本 鸿蒙 微信小程序
× × 5.0 1.0.0 12 1.0.0 × ×

其他

多语言 暗黑模式 宽屏模式
× ×

kongbai-socket

面向 uni-app x App 的 Android、iOS 原生 TCP/UDP 通信插件。插件不依赖第三方网络库,支持客户端、服务端、持续收发、广播和二进制数据。

支持范围

  • TCP 客户端连接、持续收发和主动断开。
  • TCP 服务端监听、接受多个客户端,并通过 clientId 分别收发和关闭。
  • UDP 本地端口绑定、单播、广播和任意目标地址发送。
  • UTF-8 文本与 Base64 二进制数据收发。
  • 连接超时、TCP keep-alive、TCP_NODELAY、地址复用和接收缓冲区配置。
  • TCP 客户端可选自动重连和最大重连次数。
  • connectingconnectedlisteningacceptedbounddatasentclosederror 事件。

仅提供 uni-app x App 的 Android 和 iOS 原生实现;Web、各类小程序和 HarmonyOS 不支持。

平台要求

平台 最低版本 原生依赖 权限或配置
Android API 21 无第三方库 插件声明 android.permission.INTERNET
iOS 12.0 无第三方库 插件声明 NSLocalNetworkUsageDescription

HBuilderX 要求 4.27.0 及以上,uni-app x 要求 3.7.13 及以上。

首次安装、升级插件或修改原生配置后,需要重新制作自定义调试基座或重新云打包。标准基座不会自动包含新增的原生插件代码。

安装

在 HBuilderX 的插件市场导入本插件,或将 kongbai-socket 目录放入项目的 uni_modules 目录。

基础 API

import {
  createKBSocket,
  startKBSocket,
  stopKBSocket,
  destroyKBSocket,
  sendKBSocketText
} from '@/uni_modules/kongbai-socket'

const socketId = createKBSocket({
  type: 'tcp',
  host: '192.168.1.20',
  port: 9000,
  connectTimeout: 5000,
  autoReconnect: true,
  reconnectDelay: 3000,
  maxReconnectAttempts: 5
}, (event) => {
  if (event['event'] == 'connected') {
    sendKBSocketText(socketId, 'hello')
  } else if (event['event'] == 'data') {
    console.log('收到文本:', event['text'] as string)
    console.log('收到 Base64:', event['base64'] as string)
  } else if (event['event'] == 'error') {
    console.error(event['code'], event['message'])
  }
})

startKBSocket(socketId)

createKBSocket 只创建内存中的 Socket,必须调用 startKBSocket 才会连接、监听或绑定 UDP。startKBSocket 返回 true 表示启动任务已提交,不代表连接已经成功;连接结果通过事件返回。

使用完成后调用 stopKBSocket(socketId)destroyKBSocket(socketId)

TCP 客户端

const clientId = createKBSocket({
  type: 'tcp',
  role: 'client',
  host: '192.168.1.20',
  port: 9000,
  tcpNoDelay: true,
  keepAlive: true
}, (event) => {
  switch (event['event']) {
    case 'connected':
      sendKBSocketText(clientId, 'ready')
      break
    case 'data':
      const base64 = event['base64'] as string
      break
    case 'closed':
      console.log('TCP 已关闭')
      break
    case 'error':
      console.error(event['code'], event['message'])
      break
  }
})
startKBSocket(clientId)

TCP 客户端的 hostport 是必填项。服务端协议需要由业务层定义消息边界,例如固定长度、换行符或长度前缀;插件不会自行拼包或拆包。

TCP 服务端

const serverId = createKBSocket({
  type: 'tcp',
  role: 'server',
  localHost: '0.0.0.0',
  port: 9000,
  backlog: 32
}, (event) => {
  const name = event['event'] as string
  if (name == 'accepted') {
    const clientId = event['clientId'] as string
    sendKBSocketText(clientId, 'welcome')
  } else if (name == 'data') {
    const clientId = event['id'] as string
    sendKBSocketText(clientId, 'echo:' + (event['text'] as string))
  }
})
startKBSocket(serverId)

服务端收到 accepted 后,clientId 就是该客户端的独立 Socket id。该 id 可以直接传给 sendKBSocketTextsendKBSocketBase64stopKBSocketdestroyKBSocket。客户端数据事件的 id 也是对应的 clientId

服务端使用完成后调用 stopKBSocket(serverId)destroyKBSocket(serverId),已接受的客户端连接会一并关闭。

UDP 单播和广播

const udpId = createKBSocket({
  type: 'udp',
  localHost: '0.0.0.0',
  localPort: 9001,
  broadcast: true,
  bufferSize: 65507
}, (event) => {
  if (event['event'] == 'bound') {
    sendKBSocketText(udpId, 'discover', '255.255.255.255', 9001)
    sendKBSocketBase64(udpId, 'AAECAwQ=', '192.168.1.20', 9001)
  } else if (event['event'] == 'data') {
    console.log('UDP 来源:', event['remoteHost'], event['remotePort'])
    console.log('UDP 内容:', event['text'])
  }
})
startKBSocket(udpId)

UDP 接收端需要使用 localPort 绑定端口。localPort0 时由系统分配临时端口,实际端口可从 bound 事件的 remotePort 字段读取。UDP 单个数据报应控制在网络 MTU 或平台允许的最大数据报范围内,插件不会拆分和重组数据报。

API 说明

createKBSocket(options, handler?)

创建 Socket 并返回唯一 id。此方法不会建立连接、开始监听或绑定 UDP,必须继续调用 startKBSocket(id)

handler 用于接收 Socket 事件,会在 Socket 生命周期内持续触发。调用 destroyKBSocket(id) 后不再接收该 Socket 的事件。

生命周期方法

方法 返回值 说明
startKBSocket(id) boolean 异步提交启动任务。返回 true 只表示任务已提交,实际结果通过事件返回;Socket 不存在或已运行时返回 false
stopKBSocket(id) 停止 Socket,关闭底层连接并触发 closed。TCP 服务端会同时停止已接受的客户端连接。
destroyKBSocket(id) 停止并删除 Socket。停止后不再使用的 Socket 应调用此方法释放插件资源。
closeAllKBSockets() 停止并删除当前插件创建的全部 Socket。

状态方法

getKBSocketState(id) 返回当前状态对象。Socket 不存在时返回 { id, state: 'missing' }

const state = getKBSocketState(socketId)

状态对象包含 idtyperolestatehostportlocalPortreconnectAttemptsstateconnectedclosed

KBSocketOptions

字段 类型 默认值 说明
type 'tcp' \| 'udp' 必填 Socket 类型
role 'client' \| 'server' client TCP 服务端传 server;UDP 传 serverlocalPort0 时,使用 port 作为本地绑定端口
host string '' TCP 客户端远端地址;UDP 默认发送目标
port number 0 TCP 远端或监听端口;UDP 默认发送目标端口
localHost string '' 本地绑定地址,空字符串表示所有 IPv4 地址
localPort number 0 UDP 本地绑定端口;TCP 服务端使用 port
connectTimeout number 10000 TCP 连接超时,单位毫秒
bufferSize number 8192 单次接收缓冲区大小,最小 256
backlog number 16 TCP 服务端等待队列长度
tcpNoDelay boolean true 是否关闭 TCP Nagle 合并
keepAlive boolean true 是否启用 TCP keep-alive
reuseAddress boolean true 是否启用地址复用
broadcast boolean false UDP 是否允许广播
autoReconnect boolean false TCP 客户端连接断开后是否自动重连
reconnectDelay number 3000 自动重连间隔,单位毫秒
maxReconnectAttempts number 0 最大重连次数,0 表示不限制

发送方法

sendKBSocketText(id, text, host?, port?) 使用 UTF-8 编码发送文本。

sendKBSocketBase64(id, base64, host?, port?) 将 Base64 解码为原始字节后发送,适合图片、二进制协议和非 UTF-8 数据。

两个方法的返回值只表示本地 Socket 是否已接受本次写入;对端是否处理成功需要由业务协议确认。发送成功会触发 sent,失败会触发 error

事件

event 主要字段 说明
connecting id TCP 客户端开始连接
connected id, remoteHost, remotePort TCP 连接建立;服务端 accepted client 也会收到
listening id, remoteHost, remotePort TCP 服务端开始监听
accepted id, clientId, remoteHost, remotePort 服务端接受一个客户端
bound id, remoteHost, remotePort UDP 绑定完成;remotePort 为实际本地端口
data id, base64, text, dataLength, remoteHost, remotePort 收到数据;TCP 的 id 可能是服务端的 clientId
sent id, dataLength, remoteHost, remotePort 本地发送完成
closed id 连接、监听或 UDP Socket 已关闭
error id, code, message 原生 Socket 错误

每个事件都包含 eventidtyperoletimestamptimestamp 为毫秒时间戳。

data 事件的 base64 是原始字节的 Base64 编码,text 是按 UTF-8 解码的字符串;非 UTF-8 数据的 text 为空,应使用 base64 处理。TCP 数据按底层读取结果回调,不提供消息边界;UDP 每个 data 事件对应一个数据报。

remoteHostremotePort 在 TCP 中表示对端地址,在 UDP data 事件中表示数据报来源;bound 事件中的 remotePort 表示实际本地端口。

常见错误码包括 connect_failedlisten_failedaccept_failedbind_failedreceive_failedread_failedsend_failedinvalid_base64

iOS 局域网说明

插件已声明 NSLocalNetworkUsageDescription。如果宿主项目有自己的 Info.plist 合并配置,应保留相同用途说明。iOS 模拟器的网络行为与真机不同,建议使用真机验证局域网设备、广播和端口复用。

生命周期与安全

  • Socket 的连接、监听、接收和发送运行在原生后台线程,事件回调回到主线程;不要在回调中执行长时间阻塞任务。
  • 页面销毁或 App 退出前应调用 stopKBSocketdestroyKBSocket;不再使用时可调用 closeAllKBSockets
  • 插件不做 TLS。需要加密传输时,应在业务层使用 TLS 代理或另行接入原生 TLS 能力,不要在明文 Socket 上传输敏感凭据。
  • 插件不会持久化、上传或缓存网络数据;事件中的数据只在回调生命周期内交给宿主应用。

版本记录

详见 changelog.md。当前版本为 1.0.0

隐私、权限声明

1. 本插件需要申请的系统权限列表:

Android 需要 INTERNET 权限;iOS 局域网通信需要宿主应用提供本地网络用途说明。

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅在调用时建立宿主应用主动指定的 TCP/UDP 连接,不采集或上传网络数据。

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无广告、无广告 SDK、无引流内容。

暂无用户评论。