赞
踩
使用python实现TCP数据上报功能,需要具体由客户端、服务端构成。代码非常简单。如下所示。
1、客户端Python代码示例
from socket import * # 1. 创建socket tcp_client_socket = socket(AF_INET, SOCK_STREAM) # 2. 链接服务器 tcp_client_socket.connect(("127.0.0.1", 26788)) # 提示用户输入数据 send_data = 'data' # 3. 向服务器发送数据 tcp_client_socket.send(send_data.encode("utf-8")) # 4.接收服务器发送的消息,最多接收1024字节 msg = tcp_client_socket .recv(1024) print(msg.decode()) # 5. 关闭套接字 tcp_client_socket.close()
2、以下代码便可运行最简单的TCP服务端
import socket # 1. 创建TCP套接字 server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定本地信息 server_s.bind(("", 26788)) # 3. 设置为被动的 server_s.listen(128) # 4. 等待客户端链接 new_s, client_info = server_s.accept() # 5. 用新的套接字为已经连接好的客户端服务器 recv_content = new_s.recv(1024) print("%s>>>%s" % (str(client_info), recv_content.decode("gbk"))) #6.服务端回复消息给客户端 new_s.send(b'OK') # 6. 关闭套接字 new_s.close() server_s.close()
3、持续接收客户端上报数据
在实际工程中,我们的服务端程序会一直监听TCP上报的数据,比如在物联网场景,因此,我们需要将TCP程序进行修改。可以参考以下样例:
import socket # 1. 创建TCP套接字 server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2. 绑定本地信息 server_s.bind(("", 26788)) # 3. 设置为被动的 server_s.listen(128) print('开始监听26788端口接收上报的信息\n') # 4. 等待客户端链接 new_s, client_info = server_s.accept() while True: # 5. 用新的套接字为已经连接好的客户端服务器 recv_content = new_s.recv(1024) print("%s>>>%s" % (str(client_info), recv_content.decode("gbk"))) #6.服务端回复消息给客户端 new_s.send(b'OK') if not recv_content: # 6. 关闭服务套接字 # 当客户端调用了close后,recv_content返回值为空时,close() new_s.close() server_s.close()
4、TCP服务端实现高并发的最优模式
为了实现高并发,我们可以将一些构成封装为类,这样来实现多并发调用,具体代码如下所示:
import socket import time from rzb.RZBstr2sqlite import str_2_db from rzb.SN import SN_JiaoYan import select import LOT_TCP_data_Process import threading class HandleData(threading.Thread): def __init__(self, client_socket,client_info): super().__init__() self.client_socket = client_socket self.client_info = client_info def run(self): # 接收/发送数据 while True: recv_content = self.client_socket.recv(1024) start_time = time.time() if len(recv_content) != 0: print(recv_content) self.client_socket.send(recv_content) msg = LOT_TCP_data_Process.tcp_data_processing(self.client_info, recv_content) return_msg = str(self.client_socket) + '\n' + msg self.client_socket.send(return_msg.encode('utf-8')) print(self.client_socket, 'finish\n') end_time = time.time() duration_time = end_time - start_time print("程序运行时间为:", duration_time, "秒") else: self.client_socket.close() break def __del__(self): self.client_socket.close() class TCPServer(threading.Thread): def __init__(self, port): # 调用父类的初始化方法 # threading.Thread.__init__(self) super().__init__() # 创建套接字 self.server_s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定本地信息 self.server_s.bind(("", port)) # 将套接字由默认的主动链接模式改为被动模式(监听模块) self.server_s.listen(128) print('开始监听26788端口接收网关上报的状态信息\n') def run(self): # 等待客户端进行链接 while True: new_s, client_info = self.server_s.accept() print(client_info) # t = HandleData(new_s) # t.start() HandleData(new_s,client_info).start() def __del__(self): # 关闭套接字 self.server_s.close() def main(): socket_recv_port = 26788 tcp_server = TCPServer(socket_recv_port) tcp_server.start() if __name__ == '__main__': main()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。