UDPSocket

立即使用

概述

什么是Socket?

两个程序通过一个双向通信连接实现数据交互,这个连接就叫Socket。是网络模型中应用层与TCP/IP协议簇通信的中间软件抽象层,即对TCP/IP进行封装的一套API。应用层可以和传输层通过Socket接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。socket可以支持不同的传输协议(TCP或UDP),当使用TCP协议进行连接时,该Socket连接就是一个TCP连接;同理,当使用UDP协议进行连接时,该Socket连接就是一个UDP连接。

Socket 通信逻辑流程:

1)服务端利用Socket监听端口;

2)客户端发起连接;

3)服务端返回信息,建立连接,开始通信;

4)客户端/服务端断开连接。

什么是粘包?

Socket 通讯是先将数据存放到缓冲区,然后发送到接受端的缓冲区,接收方再读取缓冲区的数据包。由于传输的过程为数据流,经过TCP传输后,三条数据被合并成了一条,这就是数据粘包。因为TCP使用了优化方法(Nagle算法)。它将多次间隔较小且数据量小的数据,合并成一个大的数据块,然后进行封包。这么做优点也很明显,就是为了减少广域网的小分组数目,从而减小网络拥塞的出现。而UDP就不会有这种情况,它不会使用块的合并优化算法。当然除了优化算法,TCP和UDP都会因为下面两种情况造成粘包:1.发送端需要等缓冲区满才发送出去,造成粘包;2.接收方不及时接收缓冲区的包,造成多个包接收。

什么是断包?

断包应该还是比较好理解的,其原理同粘包。

模块概述

本模块封装了 Socket 相关功能接口,是建立的基于 UDP 的链接。可通过 createAndBind 创建 Socket 并绑定端口号。udp 不用连接,所以调用 sendData 接口直接发送数据。addReceiveDataListener 接口可以监听接收到的数据。注意:模块只支持发送一定大小的字符串。

本模块是单例模式,在全局任何地方调用本模块都是同一个 socket 的实例对象。

接口

createAndBind

开启 Socket 并绑定端口

createAndBind({params}, callback(ret, err))

params

port:

  • 类型:数字
  • 描述:(可选项)端口号
  • 默认值:8181

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
   status: true        //布尔类型;是否成功 
}

err:

  • 类型:JSON 对象
  • 内部字段:
{
   msg:''              //字符串类型;失败信息
   code:               //数字类型;错误码
}

示例代码

var UDPSocket= api.require('UDPSocket');
UDPSocket.createAndBind({
    port:3445
},function(ret, err) {
    if (ret.status) {
        console.log(JSON.stringify(ret));
    } else {
        console.log(JSON.stringify(err));
    }
});

可用性

Android 系统,iOS 系统

可提供的 1.0.0 及更高版本

sendData

发送数据

sendData({param},callback(ret, err))

params

port:

  • 类型:数字
  • 描述:端口号

IP:

  • 类型:字符串
  • 描述:地址

data:

  • 类型:字符串
  • 描述:发送的字符串数据

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{
   status: true        //布尔类型;是否成功  
}

err:

  • 类型:JSON 对象
  • 内部字段:
{
   msg:''              //字符串类型;失败信息
   code:               //数字类型;错误码
}

示例代码

var UDPSocket= api.require('UDPSocket');
UDPSocket.sendData({
    port:3445,
    IP:'192.16.10.10'
},function(ret, err) {
    if (ret.status) {
        console.log(JSON.stringify(ret));
    } else {
        console.log(JSON.stringify(err));
    }
});

可用性

Android 系统,iOS 系统

可提供的 1.0.0 及更高版本

getAddress

获取 IP

getAddress(callback(ret, err))

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 描述:获取的地址信息
  • 内部字段:
{
    status: true ,     //布尔类型;true|false
    IP:'',             //字符串类型;当前网络地址  
}

err:

  • 类型:JSON 对象
  • 内部字段:
{
    msg:''              //字符串类型;错误信息
}

示例代码

var UDPSocket= api.require('UDPSocket');
UDPSocket.getAddress(function(ret,err){
    if (ret.status) {
        console.log(JSON.stringify(ret));
    } else {
        console.log(JSON.stringify(err));
    }
});

可用性

Android 系统,iOS 系统

可提供的 1.0.0 及更高版本

addReceiveDataListener

监听客户端发送来数据的事件

addReceiveDataListener(callback(ret))

callback(ret, err)

ret:

  • 类型:JSON 对象
  • 内部字段:
{ 
    string:           //字符串类型;收到的字符串,仅当receiveString时有值
}

示例代码

var UDPSocket= api.require('UDPSocket');
UDPSocket.addReceiveDataListener(function(ret){
    api.alert({msg:JSON.stringify(ret)});
});

可用性

Android 系统,iOS 系统

可提供的 1.0.0 及更高版本