如何修复客户端/服务器中的错误重新提问

问题描述

我想从我的列表中随机选择一个元素,所以我使用 random.sample(output,1) 然后将其删除,但首先我将此元素传输到客户端进程,然后再删除它。我想要做的是让客户确认它是否想要所述元素,如果它说不,则不要删除它。我试图实现这一点,但不是在运行服务器时出错,而是在运行客户端进程并连接到服务器后出错。真的很想让这个工作,所以感谢帮助!

另外给出的错误不是在连接本身,而是在它们之间的数据传输中,在服务器端的 threaded_client 函数中,特别是在定义 stock 变量时。它说 AttributeError: 'builtin_function_or_method' 对象没有属性 'sample'

服务器代码:

import socket
from _thread import *
import random

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',0.13),'Corticeira Amorim',10.58),'CTT',5.12),'EDP Renováveis',20.64),'EDP',4.67),'Galp',8.70),'Ibersol',5.82),'Jerónimo Martins',16.83),'Mota-Engil',1.35),'NOS',3.03),'Novabase',4.60),'PHAROL',0.11),'REN',2.37),'Semapa',11.50),'Sonae',0.80),'Sonac',0.77),'The Navigator Company',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()

try:
    tcp.bind(ADDR)
except socket.error as e:
    print(str(e))

print("A aguardar ligação")
tcp.listen(10)
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST,socket.SOCK_STREAM)

try:
    tcp.bind(ADDR)
except socket.error as e:
    print(str(e))

print("Awaiting conn")
tcp.listen(10)

def threaded_client(connection):
    connection.send(str.encode('Bem vindo à bolsa'))
    stock = random.sample(output,1)
    order = str(stock)
    while True:
        data = connection.recv(2048)
        if not data:
            break
        print(data.decode('utf-8'))
        tcp.send(str.encode(('Do you want this stock?' + order)))
        reply = connection.recv(2048)
        print(reply.decode('utf-8'))
        if (reply == 'Y'):
            tcp.send(str.encode(order))
            output.remove(order)
        elif (reply == 'N'):
            break
        else:
            tcp.send(str.encode('Insert valid letter'))

    connection.close()

客户端代码:

import socket

Client = socket.socket(socket.AF_INET,socket. SOCK_STREAM)
PORT = 5050
HOST = socket.gethostbyname(socket.gethostname())
ADDR = (HOST,PORT)
compras = []

print('Awaiting conn')
try:
    Client.connect(ADDR)
except socket.error as e:
    print(str(e))

Response = Client.recv(1024)
while True:
    Client.send(str.encode('I wanna trade!'))
    Response = Client.recv(1024)
    print(Response.decode('utf-8'))
    Check = input('Y/N: ')
    Client.send(str.encode(Check))
    final = Client.recv(1024)
    compras.append(final.decode('utf-8'))
Client.close()

解决方法

您只向我们展示了您的部分代码,因此我们无法做太多事情。我猜您有 from random import random,这就是导致您的 AttributeError 的原因。这会导入随机函数,而不是随机模块。你需要import random

鉴于该错误,您的服务器代码都没有运行过。您将 encode 拼错为 enconde。您正在从 output 获取样品。但您正在将其从 records 中删除。

您可以想象,这不是进行客户端/服务器设置的好方法。您不想反复来回交换东西。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...