问题描述
我正在使用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]包含'(单引号)。我必须做
if recv_data[2:5] == 'EPC':
我的问题是,为什么EPC从索引[2]而不是[0]开始。知道如何将EPC实际放置在索引[0]处并将0xFE放置在索引[1]处,依此类推。
很抱歉这个la脚的问题,我实际上是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',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'
。