事实上,物联网的思路很简单,客户端设备通过TCP协议上传到某个云服务器的端口,我们需要在这个云服务器上编写一个小小的脚本去创建某个端口,持续监听,可以互相发送数据,这个脚本语言可以是JAVA,也可以是Python,或者其他语言。我之前的博客就使用了JAVA脚本的方式,这篇文章谈谈Python。
学习一门语言,就是在该语言的环境下,我们通过撰写该语言的逻辑系统,实现某种我们想要的功能。因此,如果我们要写python脚本,首先要做的就是搭建python环境,不同系统搭建的方法不同,因为我用的是云服务器搭建物联网系统,因此我的系统的Linux:
搭建好环境以后,使用vim 直接建立一个 .py的文件,在文件上编辑上我们想要的代码,就可以直接运行:
python xx.py
不需要像java那样先来个javac编译一下。当然,编译有编译的好处,可以提前发现问题,提前解决问题。
TCP双向持续监听代码:
#!/usr/bin/python3
# 文件名:server.py
# 导入 socket、sys 模块
import socket
import sys
from socket import *
from threading import Thread
def recv_data():
while True:
recv_data = client_socket.recv(1024) # 最大接收1024字节
recv_content = recv_data.decode("utf-8")
print(f"客户端说:{recv_content},来自:{client_info}")
if recv_content == "end":
print("结束通信!")
break
def send_data():
while True:
msg = input(">")
client_socket.send(msg.encode("utf-8"))
if msg == "end":
print("结束通信!")
break
while True:
server_socket = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字
host = gethostname()
server_socket.bind((host, 8888)) # 本机监听8888端口
server_socket.listen(5)
print("等待接收连接!")
client_socket, client_info = server_socket.accept()
print("客户端建立连接成功!")
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t1.start()
t2.start()
t1.join()
t2.join()
client_socket.close()
运行以上的代码,然后我们本地电脑安装一个TCP调试助手,连接到该服务器和端口,就是互相发送数据。
不过如果你足够细心,应该会发现上面的代码还不够好,先看看修改后的:
server_socket = socket(AF_INET, SOCK_STREAM) # 建立TCP套接字
host = gethostname()
server_socket.bind((host, 8888)) # 本机监听8899端口
server_socket.listen(5)
print("等待接收连接!")
client_socket, client_info = server_socket.accept()
print("客户端建立连接成功!")
while True:
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t1.start()
t2.start()
t1.join()
t2.join()
client_socket.close()
这块代码不同之处是将while循环的语句缩小了,原本的代码逻辑是一直循环建立套接字,改了以后的逻辑是,建立套接字我们只做一次就可以,剩下的处理发送和接受函数就可以,这样会看起来很简洁,而且从资源占用情况来说,按理是后面代码占用的资源会少一些。