什么时候需要长连接

当需要高频率实时发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)

用到的函数:

2024-03-26T13:37:13.png

创建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连接