前一段时间需要和一个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()