Форум программистов, компьютерный форум, киберфорум
Python: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 12.12.2019
Сообщений: 26
1

Проблемы в работе эхо-сервера

07.04.2023, 16:09. Показов 1085. Ответов 1

Author24 — интернет-сервис помощи студентам
Добрый день, форумчане! Решил освоить асинхронное программирование (если интересно, иду по книге Asyncio и конкурентное программирование на Python под авторством Мэттью Фаулера), и в качестве примера работы неблокирующих сокетов дан пример кода простого эхо-сервера.
Вот его код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_address = ('127.0.0.1', 8000)
server_socket.bind(server_address)
server_socket.listen()
try:
    connection, client_address = server_socket.accept()
    print(f'Получен запрос на подключение от {client_address}!')
    buffer = b''
    while buffer[-2:] != b'\r\n':
        data = connection.recv(2)
        if not data:
            break
        else:
            print(f'Получены данные: {data}!')
        buffer += data
    print(f"Все данные: {buffer}")
    connection.sendall(buffer)
finally:
    connection.close()
Все это плюс-минус понимаю, но вопросы появляются с клиентом telnet, который должен подключаться к моему главному сокету.
1) В книге советуют использовать приложение PuTTY, чтобы запустить клиент telnet. В этой проге я совсем ничего не понимаю
В графе host name (or IP address) я уже что не писал. Варианты 127.0.0.1 и 127.0.0.1:8000. Оба варианта кончаются одним. Терминал открывается и почти сразу возникает ошибка Network error: Connection refused.
После я попробовал изменить порт в строке server_address = ('127.0.0.1', 8000) на 23, т.е.
server_address = ('127.0.0.1', 23) и все вроде заработало, клиент получает дублированное сообщение (хоть и заканчивается с ошибкой, не знаю, может так и надо). Но меня начало беспокоить что-то другое. В книге написано, что при написании в клиенте testing123 должен быть результат в выводе Python:
Получен запрос на подключение от ('127.0.0.1', 50192)!
Получены данные: b'te'!
Получены данные: b'st'!
Получены данные: b'in'!
Получены данные: b'g1'!
Получены данные: b'23'!
Получены данные: b'\r\n'!
Все данные: b'testing123\r\n'
Но у меня при открытии клиента сначала в буфер скидываются непонятные байты, а уже после нужный результат:
Получен запрос на подключение от ('127.0.0.1', 50192)!
Получены данные: b'\xff\xfb'!
Получены данные: b'\x1f\xff'!
Получены данные: b'\xfb '!
Получены данные: b'\xff\xfb'!
Получены данные: b'\x18\xff'!
Получены данные: b"\xfb'"!
Получены данные: b'\xff\xfd'!
Получены данные: b'\x01\xff'!
Получены данные: b'\xfb\x03'!
Получены данные: b'\xff\xfd'!
Получены данные: b'\x03'!
Получены данные: b'te'!
Получены данные: b'st'!
Получены данные: b'in'!
Получены данные: b'g1'!
Получены данные: b'23'!
Получены данные: b'\r\n'!
Все данные: b"\xff\xfb\x1f\xff\xfb \xff\xfb\x18\xff\xfb'\xff\xfd\x01\xff\xfb\x03\xff\xfd\x03testing123\r\n"
Вроде бы ничего, но никак не могу понять, что это за байты. Пытался добавить код для декодировки, но выкидывает ошибку.
строка:
print(buffer.decode('utf-8'))
Результат:
Получен запрос на подключение от ('127.0.0.1', 50231)!
Получены данные: b'\xff\xfb'!
Получены данные: b'\x1f\xff'!
Получены данные: b'\xfb '!
Получены данные: b'\xff\xfb'!
Получены данные: b'\x18\xff'!
Получены данные: b"\xfb'"!
Получены данные: b'\xff\xfd'!
Получены данные: b'\x01\xff'!
Получены данные: b'\xfb\x03'!
Получены данные: b'\xff\xfd'!
Получены данные: b'\x03'!
Получены данные: b'\r\n'!
Все данные: b"\xff\xfb\x1f\xff\xfb \xff\xfb\x18\xff\xfb'\xff\xfd\x01\xff\xfb\x03\xff\xfd\x03\r\n"
Traceback (most recent call last):
File "D:\github\studeing_asyncio\main.py", line 19, in <module>
print(buffer.decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Наконец вопрос: Что это за байты в буфере?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2023, 16:09
Ответы с готовыми решениями:

Проблемы с написанием локального эхо-Сервера в QT на macOS
Всем привет! Учусь на первом курсе и только начинаю разбираться в тонкостях разработки на c++. По...

Создание эхо сервера
Здравствуйте, извините, если ошибся с разделом форума. Помогите, пожалуйста, разобраться с кодом...

Создание эхо-сервера
Помогите написать эхо-сервер. Сервер должен слушать указанный TCP порт, транслировать данные из...

Проблемы со звуком. Эхо!
Помогите пожалусйта! У меня не давно полетела материнская плата, мне её конечно поменяли! Но...

Клиент для ЭХО сервера в линуксе
Всем привет. Пытаюсь разобратся с темой сокетов. Есть функция которая вызывается в случаи если...

1
3564 / 2711 / 347
Регистрация: 11.03.2009
Сообщений: 6,241
08.04.2023, 11:55 2
Лучший ответ Сообщение было отмечено dj_jd как решение

Решение

Цитата Сообщение от dj_jd Посмотреть сообщение
клиент получает дублированное сообщение (хоть и заканчивается с ошибкой, не знаю, может так и надо)
Какой ошибка, "Process finished with exit code 0"? Это шатное завершение программы.
Цитата Сообщение от dj_jd Посмотреть сообщение
while buffer[-2:] != b'\r\n':
По коду обработка идет, пока не приедет новая строка (в клиенте не нажмем клавишу Enter), после чего программа завершается.

Цитата Сообщение от dj_jd Посмотреть сообщение
Наконец вопрос: Что это за байты в буфере?
Клиент договаривается с сервером о параметрах связи. https://ru.wikipedia.org/wiki/Telnet смотрите раздел "Структура команд Telnet"
1
08.04.2023, 11:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.04.2023, 11:55
Помогаю со студенческими работами здесь

VS c++ sockets (errors), Пример реализации TCP эхо-сервера
начал узучать сокеты в с++ , нашёл пример клиент серверного приложения. но возникают ошибки ,не...

Комментарии к коду эхо-клиент/эхо-сервер
Ребятки ,нужна очень ваша помощь !!! кому не тяжело напишите пожалуйста коментарии к кодам...

Ошибка "Соединение не установлено" при реализации эхо сервера
Здравствуйте. Попробовала перевести свой С код эхо клиента на С++. До этого он прекрасно работал и...

Тормоза в работе HTTP сервера
Суть проблемы такова, я начал вникать в то как все работает в Node.js и все бы ничего, да вот...

Зависание сервера при работе 1С
Вобщем ситуация в следующем. При работе в базе обычного пользователя (у пользователя полные права)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru