首页 > 解决方案 > 如何在 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()

谢谢。

标签: pythonpython-3.xsocketsclient-server

解决方案


这是因为,当您调用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'


推荐阅读