Я хочу создать функцию Cipher's Cipher в python, используя клиент/сервер. Клиент отправляет сообщение с ключом, а сервер шифрует его. Код сервера:
import socket
def getCaesar(message, key):
result = ""
for l in message:
if l.isalpha():
num = ord(l)
num += key
if l.isupper():
if num > ord('Z'):
num -= 26
elif num < ord('A'):
num += 26
elif l.islower():
if num > ord('z'):
num -= 26
elif num < ord('a'):
num += 26
result += chr(num)
else:
result += l
return result
serverSock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=socket.gethostname()
port=4000
serverSock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
serverSock.bind((host,port))
serverSock.listen(5)
print("Listenting for requests")
while True:
s,addr=serverSock.accept()
print("Got connection from ",addr)
print("Receiving...")
message=s.recv(1024)
key=s.recv(1024)
resp=getCaesar(message, key)
print('Ciphertext: ')
print(resp)
serverSock.close()
Строка, которая продолжает вызываться, это строка 6: 'if l isalpha(): ' и дает мне ошибку: AttributeError: объект «int» не имеет атрибута «isalpha». Что означает эта ошибка?
Клиентская программа:
import socket
def getMessage():
print('Enter your message:')
return input()
def getKey():
key = 0
while True:
print('Enter the key number (1-%s)' % (26))
key = int(input())
if (key >= 1 and key <= 26):
return key
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host=socket.gethostname()
port=4000
s.connect((host,port))
message = getMessage()
key = getKey()
message=message.encode()
s.send(message)
s.send(bytes(key))
cipher= s.recv(1024)
print('Ciphertext: ')
print(cipher)
s.close()






В Python 3 socket recv возвращает неизменяемую последовательность bytes. Каждый элемент имеет тип int и находится в диапазоне [0, 255]. isalpha — это метод str, а не метод int.
Если вы хотите обрабатывать ответ сервера как строку, вы можете декодировать байты.
string = response.decode('utf-8')
for c in string:
if c.isalpha():
[...]
Это избавило от этой ошибки, но теперь указывает на строку 10 в ключе getCaesar: num += с ошибкой: TypeError: неподдерживаемые типы операндов для +=: 'int' и 'bytes'. Имеет ли вообще значение, что клиентская программа имеет: message=message.encode()?