python发送byte数据组到tcp的server问题
更新时间:2023年09月06日 16:06:05 作者:橙木
这篇文章主要介绍了python发送byte数据组到tcp的server问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
python发送byte数据组到tcp的server
前一段时间需要和一个tcp服务端进行数据交互,有约定好的数据报文格式,但是是以十六进制形式定义的的,所以在测试数据反馈的时候用python写了一个byte[]数据发送的tcp clinet端的测试demo
代码如下:
from socket import * import struct import time import sys def init(x):#初始化需要发送的list数组 lists = [[0]*8 for i in range(7)]#定义list的行列大小 for i in range(7): lists[i].append(0)#填充0 lists[i][3] = 5 lists[i][4] = int(x)#填充序号 lists[0][7] = 16#填充指令id lists[1][7] = 17 lists[2][7] = 18 lists[3][7] = 19 lists[4][7] = 20 lists[5][7] = 24 lists[6][7] = 25 return lists def main(): # 1.创建tcp_client_socket 套接字对象 tcp_client_socket = socket(AF_INET,SOCK_STREAM) # 作为客户端,主动连接服务器较多,一般不需要绑定端口 # 2.连接服务器 tcp_client_socket.connect(("127.0.0.1",7001)) a = sys.argv[1] while True: for i in range(7): print(init(a)[i]) """无限循环可以实现无限发送""" # 3.向服务器发送数据 cmd = init(a)[i] to_server = "" for i in range(len(cmd)): to_server += chr(cmd[i]) print(repr(to_server)) print("发送的消息为:",to_server.encode()) tcp_client_socket.send(to_server.encode())# 在linux中默认是utf-8编码 # 在udp协议中使用的sendto() 因为udp发送的为数据报,包括ip port和数据, # 所以sendto()中需要传入address,而tcp为面向连接,再发送消息之前就已经连接上了目标主机 #time.sleep(1) # 4.接收服务器返回的消息 recv_data = tcp_client_socket.recv(1024) # 此处与udp不同,客户端已经知道消息来自哪台服务器,不需要用recvfrom了 if recv_data: print("返回的消息为:",recv_data) else: print("对方已离线。。") break tcp_client_socket.close() if __name__ == '__main__ main()
python tcp server-client
基本思路
- 1、指定IP、端口号;
- 2、绑定;
- 3、开启监听;
- 4、接受连接创建socket;
- 5、收发数据
tcp_server
# tcp_server # coding=utf-8 # !/usr/bin/env python import socket import time import threading serverIP = "0.0.0.0" serverPort = 10620 clientSocketList = [] # 放每个客户端的socket def init_server(): sockServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sockServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_addr = (serverIP, serverPort) sockServer.bind(server_addr) sockServer.listen(10) print(server_addr) print("The server has started, waiting for the client to connect ......") return sockServer def accept_client(sockServer): while True: time.sleep(0.1) clientSock, addr = sockServer.accept() strTime = time.strftime('%Y-%m-%d %H:%M:%S') strPrint = 'connected from: {}'.format(addr) strPrint = strTime + strPrint print(strPrint) clientSock.setblocking(0) clientSocketList.append([clientSock, addr]) def server_Send(direction): while True: time.sleep(0.1) try: sendByte = bytes(direction) for clientInfo in clientSocketList: currClient, addr = clientInfo currClient.sendall(sendByte) print("to {}, send <{}> ".format(addr, sendByte)) except Exception as e: clientSocketList.remove(clientInfo) continue def server_Recv(): while True: time.sleep(0.1) for clientInfo in clientSocketList: # print(client.getsockname()) # print(client.getpeername()) currClient, addr = clientInfo try: dataRecv = currClient.recv(1024) except Exception as e: continue if not dataRecv: clientSocketList.remove(clientInfo) print("currClient{} has closeed.\n".format(addr)) continue try: direction = float(dataRecv) strTime = time.strftime('%Y-%m-%d %H:%M:%S') strRecv = "from {} recv len={}, data={}".format(addr, len(dataRecv), direction) print(strRecv) except Exception as e: print(e) pass if __name__ == '__main__': sockServer = init_server() threadCheckClient = threading.Thread(target=accept_client, args=(sockServer, )) # 子线程 # threadCheckClient.setDaemon(True) threadCheckClient.start() threadSend = threading.Thread(target=server_Recv) # 子线程 # threadSend.setDaemon(True) threadSend.start()
tcp_client
# tcp_client # coding=utf-8 # !/usr/bin/env python import socket import sys, time from threading import Thread serverIP = '127.0.0.1' serverPort = 10620 def init_client(): tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: tcp_client.connect((serverIP, serverPort)) except socket.error: print('fail to setup socket connection') return tcp_client def client_Send(tcp_client): while True: time.sleep(0.1) time.sleep(1) try: strTime = time.strftime('%Y-%m-%d %H:%M:%S') strTime = str(12345.5678909) sendBytes =strTime.encode() tcp_client.sendall(sendBytes) print(sendBytes) except Exception as e: break def client_Recv(tcp_client): while True: time.sleep(0.1) try: dataRecv = tcp_client.recv(1024) # 到这里程序继续向下执行 except Exception as e: continue if not dataRecv: break else: strTime = time.strftime('%Y-%m-%d %H:%M:%S') strRecv = "from server recv len={}, data={}".format( len(dataRecv), dataRecv) strPrint = strTime + strRecv print(strPrint) if __name__ == "__main__": tcp_client = init_client() threadSend = Thread(target=client_Send, args=(tcp_client, )) # 子线程 threadSend.start()
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
关于Python 多重继承时metaclass conflict问题解决与原理探究
这篇文章主要介绍了Python 多重继承时metaclass conflict问题解决与原理探究 ,需要的朋友可以参考下2022-10-10Python 计算机视觉编程进阶之OpenCV 图像锐化及边缘检测
计算机视觉这种技术可以将静止图像或视频数据转换为一种决策或新的表示。所有这样的转换都是为了完成某种特定的目的而进行的,本篇我们来学习下如何对图像进行锐化处理以及如何进行边缘检测2021-11-11
最新评论