Par*_*yes 6 php python apache django socket.io
我有一个网络服务器,它在端口20000上为客户端提供一个八位字节流(它实际上是一个用node.js托管的socket.io服务器).这是在共享主机帐户上运行的,其中常规Apache服务器在端口80上运行(这不能关闭,因此socket.io服务器在端口20000上).由于防火墙等,我不能指望用户能够连接到端口20000(或80以外的任何端口).那么,如何使用来自Apache服务器的socket.io服务器生成的八位字节流(有点像反向代理)来为客户端提供服务?不幸的是,我不能在我的Apache服务器上使用mod_proxy给出托管计划的限制.我以为我可以用一个以某种方式打开套接字的PHP页面来做到这一点.
更新:我的服务器上安装了Django for Python 3,这可能很有用.请注意,代理不能简单地请求目标页面并将其提供给客户端,因为必须实时传输数据.
关于“它不能简单地返回目标页面”……这不是真的,因为这就是 HTTP 代理的全部内容。大多数协议代理使用套接字(而不是文件或管道)并简单地将数据从套接字复制到套接字。HTTP 代理执行相同的操作,只是每个 HTTP 请求都需要握手,因此代理在到达有效负载之前需要来回几个数据包。您可以在 django 中非常轻松地创建 HTTP GET 代理。POST 代理需要额外的步法。
我不熟悉 Socket.IO,但经过研究...... socket.io 是如何工作的?...看起来它只使用“旧”HTTP 功能并以 REST 方式运行所有内容。REST 被封装为持久套接字内的传输。
如果您在 Django 中寻找 TCP 或 IP 级代理,那么这是不可能的。你的 apache 服务器,然后 WSGI/CGI/任何东西都会关闭你的 TCP 套接字。您能够访问它的唯一方法是对服务器的这些部分拥有足够的权限。
这就是我要做的...在 django 中创建一个捕获 socket.io api 的 url 模式,并将其连接到执行如下操作的视图(未经测试的伪代码):
import urllib2, mimetypes
from django.http import HttpResponse
def ForwardToSocketIO(request):
# Capture the URL pattern
path = request.get_full_path()
# Create a URL opener
response = urllib2.urlopen('http://localhost:20000%s' % path)
# Capture and return response
django_response = HttpResponse(response.read())
django_response['Content-Type'] = 'octet-stream'
return django_response
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。我没有可用的八位字节流,因此很抱歉没有进行测试。