Python套接字发送消息无效的HTTP

时间:2014-08-29 11:58:17

标签: python django sockets websocket socket.io

我在我的django项目中有一个套接字服务器django-socketio (正常工作),我尝试使用以下代码为它发送消息:

import socket
import json

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.connect(('127.0.0.1' , 9000))
data = {
    'username': 'avt',
    'password': 123,
    'amount': 100
}
message = json.dumps(data)
s.sendall(message)

收到错误:

<socket fileno=5 sock=127.0.0.1:9000 peer=127.0.0.1:58952>: Invalid HTTP method: '{"username": "avt", "amount": 100, "password": 123}'

2 个答案:

答案 0 :(得分:1)

您正在与WebSocket服务器通信。因此,您需要使用WebSocket协议。

您的代码将以下字符串发送到服务器:

{"username": "avt", "amount": 100, "password": 123}

但你实际上需要发送这样的东西(开始协议握手):

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:9000
Origin: http://127.0.0.1:9000
Sec-WebSocket-Key: gCJZxvFvQ2Wa/flhLUvAtA==
Sec-WebSocket-Version: 13

上述请求是使用websocket-client使用以下代码生成的:

import json
import websocket

ws = websocket.WebSocket()
ws.connect('ws://127.0.0.1:9000/')
ws.close()

您可以尝试使用WebSocket echo服务器:

ws.connect('ws://echo.websocket.org/')
# now you can send data...
data = {
    'username': 'avt',
    'password': 123,
    'amount': 100
}

>>> ws.send(json.dumps(data))
57
>>> ws.recv()
'{"username": "avt", "amount": 100, "password": 123}'

答案 1 :(得分:0)

您的django应用程序需要有效的HTTP请求(如此处所述:http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html),而不仅仅是json转储。因此,您需要手动编写(正确的)完整的HTTP请求,或使用更高级别的工具,例如stdlib&#39; s urllib,或者更好的是,第三部分&#34;请求&#34 ; lib(http://docs.python-requests.org/en/latest/)。