Проверьте WebSocket (wss) с помощью Postman, Python
Проверьте WebSocket (wss) с помощью Postman, Python

Предисловие

  • WebSocket(wss) Он стал неотъемлемой частью современной веб-разработки, обеспечивая двустороннюю связь между клиентом и сервером в режиме реального времени. тест WebSocket Совместное использование имеет важное значение для обеспечения его надежности, безопасности и производительности. В этом руководстве мы обсудим использование Postman и Python Как протестировать WebSocket(wss)

инструмент

  • Python 3.x
  • Postman

Postman

  • Postman Это мощный API Разработано для упрощения и ускорения API Процесс создания и отладки. Помимо традиционных HTTP Запрос на внешний тест,Postman Также поддерживает WebSocket протокол, чтобы разработчики могли легко отлаживать WebSocket соединять。
  • от Postman 8.0 Начиная с версии, пользователи могут использовать Postman тести Отладка WebSocket соединять。

Создать новый тест WSS

соединять topic

  • В качестве примера я использую случай из Интернета.:wss://ws.dyhjw.com/?token=
  • соединятьчасть после успеха wss Сообщения необходимо отправлять для установления связи, например, для установления источника сообщения, требующего связи.
  • Отправьте сообщение для установления связи
Язык кода:txt
копировать
{
    "cmd": "sub",
    "codes": [
        "AUTD",
        "XAU"
    ]
}
  • Общение в режиме реального времени:
  • Вы можете видеть выше нормальное и wss Сервер общается.

wss Аутентификация(Unexpected server response: 200

  • если твой wss Серверу требуются операции аутентификации, затем вам необходимо пройти аутентификацию в соответствии с конкретным методом аутентификации, например header Добавить cookie и так далее, иначе можно вернуться 200 код состояния

использовать Python соединять

Версия кода первая

Язык кода:python
кодКоличество запусков:0
копировать
import asyncio
import time

import websockets


class WebSocketClient:
    def __init__(self, uri, auth_cookie):
        self.uri = uri
        self.auth_cookie = auth_cookie
        self.websocket = None

    async def connect(self):
        self.websocket = await websockets.connect(self.uri, extra_headers={"Cookie": self.auth_cookie})

    async def subscribe(self, topic):
        if self.websocket:
            await self.websocket.send(
                build_message("SUBSCRIBE", {"id": "sub-0", "destination": topic}))

    async def send_message(self, message):
        if self.websocket:
            await self.websocket.send(message)

    async def receive_message(self):
        if self.websocket:
            response = await self.websocket.recv()
            return response

    async def send_heartbeat(self):
        while True:
            await asyncio.sleep(5)  # Отправляйте сообщение об обнаружении пульса каждые 5 секунд.
            if self.websocket:
                await self.websocket.send(build_message("SEND", ''))
                print(f"Пульс успешно отправлен -------")

# Определите содержимое сообщения в соответствии с форматом сообщения
def build_message(command, headers, msg=None):
    BYTE = {
        'LF': '\x0A',
        'NULL': '\x00',
        'HIDDEN': '\u0001'
    }
    data_arr = [command + BYTE['LF']]

    # add headers
    for key in headers:
        data_arr.append(key + ":" + headers[key] + BYTE['LF'])

    data_arr.append(BYTE['LF'])

    # add message, if any
    if msg is not None:
        data_arr.append(msg)

    # terminate with null octet
    data_arr.append(BYTE['NULL'])

    frame = ''.join(data_arr)

    # transmit over ws
    print("Данные после построения:" + frame)

    return frame


async def main():
    uri = "wss://xxxxx"
    # Добавить аутентификацию разрешений
    auth_cookie = ("xxxxx")
    topics = ["/topic/xxxxx"]

    client = WebSocketClient(uri, auth_cookie)
    await client.connect()
    # connect message
    await client.send_message(
        build_message("CONNECT", {"passcode": "", "accept-version": "1.0,1.1,1.2", "heart-beat": "5000,0"}))
    # Запустите задачу обнаружения пульса, иначе сервер автоматически отключит соединение.
    asyncio.create_task(client.send_heartbeat())
    time.sleep(2)

    for topic in topics:
        await client.subscribe(topic)
        print(f"{topic} Подписка прошла успешно")

    while True:
        print("Ожидание получения сообщения------")
        response = await client.receive_message()
        print(f"Получено сообщение: {ответ}")


asyncio.run(main())

Вторая версия кода

  • Посоветуйте, как написать код второй версии.,Общий код менее связан,Инкапсуляция лучше.
Язык кода:python
кодКоличество запусков:0
копировать
import threading
import time

import websocket

# адрес доступа к сокету:
socket_add = 'wss://xxxx'


def on_message(ws, message):
    print(f"Получено сообщение: {message}")


def on_error(ws, error):
    # Когда программа сообщает об ошибке, срабатывает событие on_error.
    print(error)


def on_close(ws, param1, param2):
    print("Connection closed------")


def on_open(ws):
    ws.send(build_message("CONNECT", {"passcode": "", "accept-version": "1.0,1.1,1.2", "heart-beat": "5000,0"}))
    time.sleep(2)
    topic = "xxxxx"
    ws.send(build_message("SUBSCRIBE", {"id": "sub-0", "destination": topic}))

    # Запустить задачу обнаружения пульса
    thread = threading.Thread(target=check_heartbeat, args=[ws])
    thread.start()


def check_heartbeat(ws):
    while True:
        time.sleep(5)
        ws.send(build_message("SEND", ''))
        print(f"Пульс успешно отправлен -------")


# Определите содержимое сообщения в соответствии с форматом сообщения
def build_message(command, headers, msg=None):
    BYTE = {
        'LF': '\x0A',
        'NULL': '\x00',
        'HIDDEN': '\u0001'
    }
    data_arr = [command + BYTE['LF']]

    # add headers
    for key in headers:
        data_arr.append(key + ":" + headers[key] + BYTE['LF'])

    data_arr.append(BYTE['LF'])

    # add message, if any
    if msg is not None:
        data_arr.append(msg)

    # terminate with null octet
    data_arr.append(BYTE['NULL'])

    frame = ''.join(data_arr)

    # transmit over ws
    print("Данные после построения:" + frame)

    return frame


def main(address=socket_add):
    websocket.enableTrace(False)
    ws = websocket.WebSocketApp(address,
                                cookie="xxxxx",
                                on_message=on_message,
                                on_error=on_error,
                                on_close=on_close,
                                on_open=on_open)
    ws.run_forever(ping_interval=5, ping_timeout=3)


if __name__ == "__main__":
    main()

вопрос

  • Ниже приведены некоторые распространенные вопросы в процессе подключения, которые вы можете использовать в качестве справки:

соединятьвозвращаться Unexpected server response: 200

  • Ссылаясь на вышеизложенное, возможно, что сервер wss требует аутентификации.

wss:// и ws:// Разница

  • wss:// и ws:// Разница заключается в безопасности и шифровании передачи.,ws:// использовать Обычный WebSocket протокол общения, wss:// использоватьзашифрованный WebSocket протокол общения,на основе TLS/SSL Зашифровать.

соединение автоматически отключится через некоторое время

  • Серверу wss может потребоваться получение сообщений Heartbeat, чтобы проверить, активен ли клиент. Если в течение определенного периода времени сообщения Heartbeat не получены, он будет отключен. (Также возможно, что сервер активно обнаруживает клиента)

Другие моменты, на которые следует обратить внимание

  • Подтвердите адрес для подключения topic Это правильно?,и требуется ли сертификация,Формат сообщения,Процесс общения и т.д.,В то же время при отладке вы можете объединять логи, распечатанные серверной частью, для устранения неполадок.,Удобное и быстрое расположение вопроса.

Профиль

👋 привет, я Lorin Лорейн, один Java Разработчик бэкэнд-технологий!девиз:Technology has the power to make the world a better place.

🚀 Моя страсть к технологиям — это моя мотивация продолжать учиться и делиться ими. Мой блог — это место об экосистеме Java, серверной разработке и последних технологических тенденциях.

🧠 как энтузиаст серверных технологий Java,Я не только увлечен исследованием новых возможностей языков и глубины технологий.,Также хочу поделиться своими идеями и лучшими практиками. Я верю, что обмен знаниями и сотрудничество сообщества могут помочь нам расти вместе.

💡 В моем блоге вы найдете информацию об основных концепциях Java, JVM. В основе технологии лежат широко используемые фреймворки, такие как Spring и Mybatis. 、Управление базами данных, например MySQL、RabbitMQ、Rocketmq и другое промежуточное программное обеспечение для Подробные статьи об сообщениях, оптимизации производительности и многом другом. Я также поделюсь некоторыми советами по программированию и способами решения вопросов.,Чтобы помочь вам лучше освоить программирование на Java.

🌐 Я поощряю взаимодействие и создание сообщества,Поэтому, пожалуйста, оставляйте свои вопросы, предложения или пожелания по теме.,Дайте мне знать, что вас интересует. также,Я поделюсь последней информацией об Интернете и технологиях.,Чтобы вы всегда были в курсе последних событий в мире технологий. Я с нетерпением жду совместной работы с вами на пути к технологиям,Давайте исследуем безграничные возможности мира технологий.

📖 Следите за обновлениями моего блога и давайте вместе стремиться к техническому совершенству.

Я участвую в последнем конкурсе эссе для специального учебного лагеря Tencent Technology Creation 2024.,Приходите и разделите со мной главный приз!

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.