Отправка числа с плавающей запятой / целого числа через сокет

#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)