什么是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 的实例对象。
开启 Socket 并绑定端口
createAndBind({params}, callback(ret, err))
port:
ret:
{
status: true //布尔类型;是否成功
}
err:
{
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({param},callback(ret, err))
port:
IP:
data:
ret:
{
status: true //布尔类型;是否成功
}
err:
{
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 及更高版本
获取 IP
getAddress(callback(ret, err))
ret:
{
status: true , //布尔类型;true|false
IP:'', //字符串类型;当前网络地址
}
err:
{
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(callback(ret))
ret:
{
string: //字符串类型;收到的字符串,仅当receiveString时有值
}
var UDPSocket= api.require('UDPSocket');
UDPSocket.addReceiveDataListener(function(ret){
api.alert({msg:JSON.stringify(ret)});
});
Android 系统,iOS 系统
可提供的 1.0.0 及更高版本