python - 如何在 Python 列表中正确插入项目并通过套接字发送?
问题描述
我正在使用 Python3 开发一个简单的客户端-服务器应用程序。客户端向服务器发送一个 13 字节的数据,服务器对其进行处理。我的 Python3 代码中有以下数据作为列表
data_s = ['EPC', 0xFE, 0xED, 0xAB, 0xCD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
我通过以下方式将此列表发送到 localhost 上的服务器应用程序
s.sendall(bytes(str(data_s),"utf-8"))
在服务器端,我通过以下方式接收数据
recv_data = client.recv(64)
recv_data = recv_data.decode()
现在我想验证我收到的数据是否在开始时实际上包含“EPC”。问题是 recv_data[0] 实际上包含 '[' 而不是 "EPC" 而 recv_data[1] 包含 ' (single quote) 。我要做
if recv_data[2:5] == 'EPC':
我的问题是为什么 EPC 从索引 [2] 而不是 [0] 开始。知道如何将 EPC 放在索引 [0] 和 0xFE 放在索引 [1] 等等。
抱歉这个蹩脚的问题我实际上是 Python 的新手,并且主要使用 C/C++ 进行编码。
服务器代码
#!usr/bin/python
import socket
import sys
import threading
data = list(list())
client_id = 0
mutex = threading.Lock()
def service_client(client, address):
global data
thread_id = threading.get_native_id()
print("Thread Created for " + address[0] + ', Thread ID: ' + str(thread_id))
with mutex:
recv_data = client.recv(64)
recv_data = recv_data.decode()
# print(recv_data[2:5])
if recv_data[2:5] == 'EPC':
data.append(recv_data)
data = (list(dict.fromkeys(data)))
print(data)
client.sendall(b'ACK ' + bytes(str(thread_id), "utf-8"))
else:
client.sendall(b'NACK ' + bytes(str(recv_data), "utf-8"))
print("Thread ID:" + str(thread_id) + " Finished")
def main():
global client_id
host = 'localhost'
port = 29600
server_socket = socket.socket() # TCP socket object
try:
server_socket.bind((host, port))
except socket.error as error:
print(str(error))
sys.exit()
print("Waiting for client...")
server_socket.listen(5)
try:
while True:
client, address = server_socket.accept() # Accept connection when client connects
print("Connected to: " + address[0] + ':' + str(address[1]))
client_thread = threading.Thread(target=service_client, args=(client, address))
client_thread.start()
# client_thread.join()
except KeyboardInterrupt:
print("KeyboardInterrupt has been caught.")
finally:
server_socket.close()
print("Server socket closed")
if __name__ == '__main__':
main()
print("Exiting Code")
客户代码
#!usr/bin/python
import socket
data_s = ['EPC', 0xFE, 0xED, 0xAB, 0xCD, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
host = 'localhost'
port = 29600
#print(data_s[0])
s = socket.socket() # TCP socket object
s.connect((host,port))
s.sendall(bytes(str(data_s),"utf-8"))
data = s.recv(1024)
print (data.decode()) # Print received(echoed) data
s.close()
谢谢。
解决方案
这是因为,当您调用str
这样的列表时,会包含方括号:
my_list = ['EPC', 'WRT']
my_str = str(my_list)
print(my_str)
产生"['EPC', 'WRT']"
. 现在,您在字符串土地上,而不是列出土地。因此,调用my_str[0]
产生字符串中的第一个字符,而不是列表的第一个元素。事实上,存在双引号和方括号。split
处理此问题的一种方法是去掉方括号和双引号,然后通过函数更改回列表:
recv_data = recv_data[2:-2].replace("'", "").replace('"', '').split(',')
这应该再次产生一个列表,并且测试recv_data[0]
应该产生'EPC'
。
推荐阅读
- mule - Dataweave 2 如何将对象映射到对象的 JSON 数组
- javascript - 在 json 中获取对象的问题。Javascript
- java - 是否存在手动抛出错误的用例?
- c# - 使用 RestClient 的 API 调用仅适用于 VisualStudio 中的调试
- java - 刷新回收站视图
- node.js - 为什么我在安装 Node 时遇到问题?
- matlab - MATLAB 中的特征归一化
- azure-devops - Azure 发布管道 - 发布测试结果 - 测试选项卡 - TFS.WebApi.Exception: System field FailingSince not found
- linux - 无法将发布的消息发送给 open62541 中的订阅者
- haskell - 将文字分配给 GHC 中的术语