#python #python-3.x
#python #python-3.x
Вопрос:
Я написал srever и клиент. Клиент просит пользователя выбрать одну из 4 команд:
NAME: возвращает имя сервера.
ВРЕМЯ: возвращает текущее время и дату.
RAND: возвращает случайное число от 1 до 10.
ВЫХОД: как это звучит…
При попытке NAME / EXIT все работает правильно.
Используя TIME, он отправляет сообщение об ошибке: «требуется объект, подобный байтам, а не «float».
Используя RAND, он отправляет сообщение об ошибке: «требуется объект, подобный байтам, а не «int».
Я уже пытался преобразовать число с плавающей запятой (при использовании TIME) в байты и получил сообщение об ошибке: «Невозможно преобразовать объект с плавающей запятой в байты
Кроме того, я попытался также преобразовать целое число RAND в байты и не получил ошибок, но я не знаю, как преобразовать байты обратно в целое число (поэтому я не могу его распечатать).
Это серверный код:
import socket
import time
import random
def main():
server_socket = socket.socket()
server_socket.bind(('0.0.0.0', 8820))
server_socket.listen(1)
(client_socket, client_adress) = server_socket.accept()
client_input = client_socket.recv(1024).decode()
if client_input == 'TIME':
client_socket.send(time.time())
elif client_input == 'NAME':
server_name = 'server2.6'
client_socket.send(server_name.encode())
elif client_input == 'RAND':
client_socket.send(random.randint(0, 10))
elif client_input == 'EXIT':
client_socket.close()
server_socket.close()
pass
else:
error_message = 'Not one of the options'
client_socket.send(error_message.encode())
client_socket.close()
server_socket.close()
if __name__ == '__main__':
main()
Это клиентский код:
import socket
def main():
my_socket = socket.socket()
my_socket.connect(('127.0.0.1', 8820))
client_input = input('Enter your command (NAMETIMERANDEXIT): ')
my_socket.send(client_input.encode())
data = my_socket.recv(1024).decode()
print (data)
my_socket.close()
if __name__ == '__main__':
main()
Комментарии:
1. Вы могли бы попробовать отправить ‘json’ по проводу, тогда все будет представлять собой строку.
2.
struct
Ответ №1:
Для кодирования в байты вы можете преобразовать в строку и указать кодировку:
bytes(str(var), encoding="UTF-8")
Это позволит вам отправлять эти числа с плавающей запятой и целые числа через сокет.
Для более продвинутого / гибкого решения вы можете использовать библиотеку struct Python для упаковки данных в закодированный объект.
Преобразование байтов обратно в int — тривиальный вопрос:
int(bytes_var)
Ответ №2:
Самый простой способ исправить ваш код — превратить float
возвращаемые by time.time()
и int
возвращаемые by random.randint()
в str
, а затем закодировать.
Попробуйте:
client_socket.send(str(time.time()).encode())
client_socket.send(str(random.randint(0, 10)).encode())
Вы также можете добавить следующую строку перед bind
вводом в код сервера, чтобы избежать Address already in use
ошибок, если вы часто запускаете свой сервер:
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)