什么时候需要长连接
当需要高频率实时发tcp数据的时候,当需要提高发送数据速度核效率时,可使用长连接
进行收发数据,因为短连接每次连接断开需要时间.
原理
使用tcp高级编程,和其它编程语言类似,在一个程序创建一个tcp的socket客户端,并连接tcp服务器端.
然后在另外一个程序发送tcp数据即可,如果发送失败,就重连,这样就可以保持长连接了.
两种方法
要实现长连接,可以使用两种方法,
tcpl
,l代表长连接, 这个是便捷的方式,这个一行指令就可以了,会自动连接发送,但是不断开.tcp
,这个是原始方式,通过tcp.new
tcp.connect
等实现.
方法1 (tcpl.send)
- 发送A写法(不接收)
tcpl.send(ch,ip,port,data,timeout)
tcpl.sendhex(ch,ip,port,data,timeout)
ch
是tcp长连接是通道 范围是 0-15 (默认共预置了16个长连接socket通道)
ip port data
和tcp.send的功能一样的,分别代表IP 端口 和要发的数据
timeout
这个是发送完数据后,在等对方返回数据,范围是 0-65535(ms)
- 发送B写法(不接收)
tcpl.ch=1
--1是通道,范围是 0-15 (默认共预置了16个长连接socket通道)tcpl.send(ip,port,data)
tcpl.sendhex(ip,port,data)
- 发送A写法+(接收)
tcpl.sendrcv(ch,ip,port,data,timeout)
tcpl.sendhexrcv(ch,ip,port,data,timeout)
ch 是tcp长连接是通道 范围是 0-15 (默认共预置了16个长连接socket通道)
ip port data 和tcp.send的功能一样的,分别代表IP 端口 和要发的数据
- 发送B写法+(接收)
tcpl.ch=1
--设置通道1,范围是 0-15 (默认共预置了16个长连接socket通道)tcpl.recvTimeout=100
--设置超时100,是发送完数据后,在等对方返回数据,范围是 0-65535(ms) tcpl.sendrcv(ip,port,data)
tcpl.sendhexrcv(ip,port,data)
ip port data 和tcp.send的功能一样的,分别代表IP 端口 和要发的数据
- 断开连接
tcpl.close(ch)
断开某个连接.
方法1例子
tcpl.send(1,"192.168.2.155",7787,"Socket111111\r\n");
tcpl.sendhex(2,"192.168.2.155",7787,"01 02 03 04");
ret=tcpl.sendrcv(3,"192.168.2.155",7787,"Socket333333\r\n",2);
ret=tcpl.sendhexrcv(4,"192.168.2.155",7787,"05 06 07 08",2);
也支持先设置通道,再发送数据
方法2 (tcp.new)
用到的函数:
创建tcp长连接
newsocket.tsk
_mysock=tcp.new(); --创建一个tcp socket,socket的id保存在全局变量 _mysock
--连接 tcp 服务器,没连接成功 2 秒后超时
ret=tcp.connect(_mysock, "192.168.2.185",7788,2);
发送数据(自动重连)
sendsocket.tsk
--val=10; --val是app滑动条/旋转按钮等控件传过来的值
data=str.sprintf("vol=%d#" , val); --根据自己的协议进行数据合并一下
si=tcp.sendto(_mysock,data); --向tcp服务器发送数据
--断线自动重连
if (si<1) then
print("发送失败,重新连接:",_mysock);
tcp.close(_mysock); --关闭出了问题的socket连接
_mysock=tcp.new(); --重新创建一个
ret=tcp.connect(_mysock, "192.168.2.185",7788,2); --连接到tcp服务器
si=tcp.sendto(_mysock,data); --向tcp服务器发送数据
end
不用时及时关闭
当不再使用该socket时,需要及时关闭,如果只打开,不关闭,到底一定数量后会导致内存溢出和网络溢出,无法正常使用网络功能.
tcp.close(_mysock); --关闭出了问题的socket连接
0 条评论