#python
Вопрос:
У меня было много проблем, чтобы наладить связь с клиентским сервером, но, наконец, добившись того, что у меня есть одна последняя небольшая проблема, с которой я не могу смириться. У меня есть список «акций», на котором я запускаю функцию, которая изменяет стоимость указанных акций в определенном диапазоне, и еще один, который «меняет» исходный список, другими словами, создает другой список в том же стиле, что и первый, с новыми значениями. После этого я устанавливаю соединение между клиентом и серверным процессом и выбираю образец из созданного списка, а после перехода между процессами и обратно есть опция, при которой, если клиент решит принять этот запас, сервер должен отправить его, а затем продолжить его удаление. Все в коде работает нормально, и товар отправляется, за исключением того факта, что после отправки товара я не могу удалить его из своего списка на стороне сервера, так как получаю ошибку list.remove(x): x not in list
.
Код сервера (исправленная версия)
import pickle
import socket
import struct
from _thread import *
import random
from time import sleep
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST, PORT)
ThreadCount = 0
tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
records = [('Empresa:', 'Altri', 'Cotação:', 5.37), ('Empresa:', 'BCP', 'Cotação:', 0.13),
('Empresa:', 'Corticeira Amorim', 'Cotação:', 10.58), ('Empresa:', 'CTT', 'Cotação:', 5.12),
('Empresa:', 'EDP Renováveis', 'Cotação:', 20.64),
('Empresa:', 'EDP', 'Cotação:', 4.67), ('Empresa:', 'Galp', 'Cotação:', 8.70),
('Empresa:', 'Ibersol', 'Cotação:', 5.82), ('Empresa:', 'Jerónimo Martins', 'Cotação:', 16.83),
('Empresa:', 'Mota-Engil', 'Cotação:', 1.35),
('Empresa:', 'NOS', 'Cotação:', 3.03), ('Empresa:', 'Novabase', 'Cotação:', 4.60),
('Empresa:', 'PHAROL', 'Cotação:', 0.11), ('Empresa:', 'REN', 'Cotação:', 2.37),
('Empresa:', 'Semapa', 'Cotação:', 11.50), ('Empresa:', 'Sonae', 'Cotação:', 0.80),
('Empresa:', 'Sonac', 'Cotação:', 0.77), ('Empresa:', 'The Navigator Company', 'Cotação:', 2.96)]
def create_random_numbs(input_list):
output_numbers = []
for given_number in input_list:
max = given_number * 1.25
min = given_number * 0.75
random_number = random.random()
random_number_in_desired_range = min (random_number * (max - min))
output_numbers.append(random_number_in_desired_range)
return output_numbers
def swap():
input_numbers = [x[-1] for x in records]
new_numbers_in_desired_range = create_random_numbs(input_numbers)
new_records = []
for item, new_number in zip(records, new_numbers_in_desired_range):
item_as_list = list(item)
item_as_list[-1] = new_number
new_records.append(tuple(item_as_list))
return new_records
output = swap()
swap()
print(output)
try:
tcp.bind(ADDR)
except socket.error as e:
print(str(e))
print("A aguardar ligação")
tcp.listen(10)
def handle_client(connection):
connection.send(str.encode('Bem vindo à bolsa'))
data = connection.recv(2048)
while True:
stock = random.sample(output, 1)
order = pickle.dumps(stock)
if data.decode('utf-8') == 'Quero trocar!':
print("Pedido de troca recebido")
size = len(order)
size_in_4_bytes = struct.pack('I', size)
connection.send(size_in_4_bytes)
sleep(0.2)
connection.send(order)
sleep(0.2)
reply = connection.recv(2048)
if reply.decode('utf-8') == 'Y':
size = len(order)
size_in_4_bytes = struct.pack('I', size)
connection.send(size_in_4_bytes)
sleep(0.2)
connection.send(order)
sleep(0.2)
output.remove(stock[0])
print(f"A nova lista de ações é{output}")
break
elif reply.decode('utf-8') == 'N':
print("Não quer comprar a ação.")
break
connection.close()
while True:
Client, address = tcp.accept()
print('Ligado a: ' address[0] ':' str(address[1]))
start_new_thread(handle_client, (Client,))
ThreadCount = 1
print('Número de ligações: ' str(ThreadCount))
tcp.close()
Комментарии:
1. Что делать, если вы повторите цикл более одного раза? Это наверняка произойдет после того, как вы запустите эту строку.
2. так ты хочешь сказать, что цикл продолжается? поэтому я просто попытался вложить операторы if и добавить разрывы, но это все равно происходит
3. это правда! Я поместил его в цикл while true, я не пробовал это с несколькими клиентами, поэтому еще не заметил. Спасибо!
Ответ №1:
Это просто, что random.sample()
всегда возвращает список, даже если вы просите только 1 элемент, поэтому вы проверяете, есть ли [x]
(и нет x
) [x, y, z]
, что, очевидно, ложно. Замените его на random.choice()
, что дает только один элемент, или измените его на что-то вроде output.remove(stock[0])
.
Ответ №2:
Сначала проверьте, есть ли объект в списке:
если x в списке: список.удалить(x)
Комментарии:
1. Я попробовал это, но это не исправляет, так как в первую очередь он не учитывает запасы, существующие в списке, он просто запускает код и игнорирует это