TypeError: 'str' object cannot be interpreted as an integer

Рейтинг: 0Ответов: 1Опубликовано: 08.03.2023

Клиент (код):

import socket

True_aliases = [True, 'True', '+', 'true', 'yes', 'Yes', 1, '1']

def processing_echo(echo):
    print(echo)

def mess(HOST, PORT):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
        s.connect((HOST, PORT))
        print('Соединение успешно установлено')
        while True:
            command = input('Введите команду (CM-client, подключено): ')
            if command.find('send') == 0:
                s.sendall(bytes(command[5:], encoding='utf8'))
            elif command.find('acc') == 0:
                s.sendall(bytes('acc', encoding='utf8'))
                print('История эхо-ответов:', dict(s.recv(1024), encoding = 'utf8'))

def main():
    while True:
        print('Клиент CM запущен успешно')
        command = input('Введите команду (CM-client): ')
        if command.find('start connect') == 0:
            HOST = input('Введите IPv4 сервера: ')
            PORT = int(input('Введите порт сервера: '))
            mess(HOST, PORT)

main()

Клиент (консоль):

Клиент CM запущен успешно
Введите команду (CM-client): start connect
Введите IPv4 сервера: 127.0.0.1
Введите порт сервера: 1042
Соединение успешно установлено
Введите команду (CM-client, подключено): send mess Очередное тестовое сообщение
Введите команду (CM-client, подключено): send mask edit MrSvinia
Введите команду (CM-client, подключено): send mask info
Введите команду (CM-client, подключено): acc
История эхо-ответов: {'encoding': 'utf8'}
Введите команду (CM-client, подключено): 

Сервер (код):

import socket
from _thread import *
import datetime

host = '127.0.0.1'
port = 1042
ThreadCount = 0

def client_handler(connection):
    client_mask = '(' + (str(connection)[str(connection).index('raddr=') + 7:])[:-1]
    recv = {'client': client_mask}
    while True:
        data = str(connection.recv(1024), encoding = 'utf8')
        if data == 'disconnect' or not data:
            print('Клиент:', client_mask + ', отключён')
            break
        elif data.find('mess') == 0:
            print(client_mask + ':', data[5:])
        elif data.find('mask') == 0:
            if data.find('edit') == 5:
                client_mask = data[10:]
                recv['client'] = client_mask
            elif data.find('info') == 5:
                recv['<' + str(datetime.datetime.now()) + '> ' + data] = 'Ваш псевдоним: ' + client_mask
            else:
                recv['<' + str(datetime.datetime.now()) + '> ' + data] = 'Команда не распознана'
        elif data.find('acc') == 0:
            print(recv)
            connection.sendall(bytes(recv))
            recv = {'client': client_mask}
        else:
            recv['<' + str(datetime.datetime.now()) + '> ' + data] = 'Команда не распознана'
    connection.close()

def accept_connections(ServerSocket):
    Client, address = ServerSocket.accept()
    print('Принято подключение с: ' + address[0] + ':' + str(address[1]))
    start_new_thread(client_handler, (Client, ))

def start_server(host, port):
    ServerSocket = socket.socket()
    try:
        ServerSocket.bind((host, port))
    except socket.error as e:
        print(str(e))
    print(f'Сервер открыт для поключений на порту {port}...')
    ServerSocket.listen()
    while True:
        accept_connections(ServerSocket)

start_server(host, port)

Сервер (консоль):

Сервер открыт для поключений на порту 1042...
Принято подключение с: 127.0.0.1:49362
('127.0.0.1', 49362): Очередное тестовое сообщение
{'client': 'MrSvinia', '<2023-03-08 17:01:07.675276> mask info': 'Ваш псевдоним: MrSvinia'}
Exception ignored in thread started by: <function client_handler at 0x000002294C3E04A0>
Traceback (most recent call last):
  File "C:\Users\niels\PycharmProjects\Charles\server\main.py", line 29, in client_handler
    connection.sendall(bytes(recv))
                       ^^^^^^^^^^^
TypeError: 'str' object cannot be interpreted as an integer

recv - это же словарь? Не могу понять где накосячил. Смысл в том, что при получении команд-запросов сервер добавляет в словарь у себя время-дата: ответ на запрос, а потом по команде acc отсылает его на клиент, где он выводиться.

Ответы

▲ 0

Нельзя просто так взять словарь и засунуть его в функцию bytes.

Эта функция принимает либо строку, либо последовательность чисел.

https://pythonworld.ru/tipy-dannyx-v-python/bajty-bytes-i-bytearray.html

Собственно, ваша ошибка говорит именно о том, что bytes видит, что ему передали не строку, а какой-то другой итерируемый объект, и пытается работать с ним как с последовательностью чисел. И т.к. в вашем словаре ключи - строки, а не числа, оно именно на этом падает.

Если вы хотите передавать словарь, то сначала его нужно тем или иным способом привести к строке. Например, с помощью модулей json или pickle.