Получение ответа «Bad Request» при попытке реализовать Websockets с использованием прямого интерфейса tcp в Python - PullRequest
0 голосов
/ 23 мая 2019

Чтобы лучше понять внутреннее содержимое websocket, я пытаюсь реализовать их через tcp, используя библиотеку сокетов python.Однако я не могу пройти через обновление HTTP.

Для начала я делаю простой запрос HTTP GET всего с 4 заголовками.Как описано здесь , это единственные, которые являются обязательными.Вот мой текущий код

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((server_ip, port))
client.send('GET / HTTP/1.1\r\nHost: server_ip\r\nConnection: Upgrade\r\nUpgrade: websocket\r\n\r\n')
resp = client.recv(4096)
print resp

Я получаю следующий ответ от сервера

HTTP/1.1 400 Bad Request
Connection: close
Content-type: text/html
Content-Length: 11

Bad Request

Чего мне не хватает в заголовке http?

PS:серверная часть - это сервер веб-сокетов, созданный с использованием nodejs

1 Ответ

0 голосов
/ 23 мая 2019

Попробуйте с:

import socket
import sys

# Create a TCP/IP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# Connect the socket to the port where the server is listening
server_address = ('server_ip', ip_port)
sock.connect(server_address)

try:
    message = 'This is the message.  It will be repeated.'
    print("Sending: " + message)
    sock.sendall(message)

    # Look for the response
    amount_received = 0
    amount_expected = len(message)

    while amount_received < amount_expected:
        data = sock.recv(16)
        amount_received += len(data)
        print("Received: " + data)

finally:
    print("Closing socket")
    sock.close()

Использование библиотеки веб-сокетов:

pip install websockets

Код:

import asyncio
import websockets

async def test():
    async with websockets.connect('ws://url') as websocket:
        await websocket.send("hello")
        response = await websocket.recv()
        print(response)
asyncio.get_event_loop().run_until_complete(test())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...