如何在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]包含'(单引号)。我必须做

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'