【问题标题】:Python socket send message Invalid HTTPPython套接字发送消息无效的HTTP
【发布时间】:2014-08-29 11:58:16
【问题描述】:

我在我的 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}'

【问题讨论】:

  • 据我所知,您正在通过连接到服务器的套接字发送原始数据,该服务器期望有效的 HTTP 请求。还是我在这里错过了什么?

标签: python django sockets websocket socket.io


【解决方案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 回显服务器:

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}'

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-05-17
      • 2019-07-04
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      相关资源
      最近更新 更多