php - 使用 PHP 或 Django 在 Apache 中重定向八位字节流

标签 php python django apache socket.io

我有一个网络服务器,它通过端口 20000 上的八位字节流为客户端提供服务(它实际上是一个由 node.js 托管的 socket.io 服务器)。这是在共享主机帐户上运行的,常规 Apache 服务器在端口 80 上运行(无法关闭,因此 socket.io 服务器在端口 20000 上)。由于防火墙等原因,我不能指望用户能够连接到端口 20000(或 80 以外的任何其他端口)。 那么,我如何使用来自 Apache 服务器(有点像反向代理)的 socket.io 服务器生成的八位位组流为客户端提供服务?不幸的是,我不能在我的 Apache 服务器上使用 mod_proxy,因为有限制我的托管计划。我想我可以用一个以某种方式打开套接字的 PHP 页面来做到这一点。

更新:我还在我的服务器上安装了适用于 Python 3 的 Django,这可能很有用。请注意,代理不能简单地请求目标页面并将其返回给客户端,因为数据必须实时传输。

最佳答案

关于“它不能简单地返回目标页面”……这是不正确的,因为这就是 HTTP 代理的全部内容。大多数协议(protocol)代理使用套接字(相对于文件或管道)并简单地将数据从套接字复制到套接字。 HTTP 代理做同样的事情,除了每个 HTTP 请求都需要握手,所以代理在到达有效负载之前需要来回发送一些数据包。您可以在 django 中非常轻松地创建一个 HTTP GET 代理。 POST 代理需要额外的步法。

我不熟悉 Socket.IO,但经过研究... how does socket.io work? ...它似乎只使用“旧的”HTTP 功能并将所有内容作为 REST 运行。 REST 被封装为持久套接字内的传输。

如果您在 Django 中寻找 TCP 或 IP 级代理,它不会发生。你的 apache 服务器,然后是 WSGI/CGI/任何关闭你的 TCP 套接字的东西。您能够访问它的唯一方法是对服务器的这些部分具有足够的权限。

这就是我要做的......在 django 中制作一个捕获 socket.io api 的 url 模式,并让它连接到一个 View ,该 View 执行如下操作(未经测试的伪代码):

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

希望这对您有所帮助。我没有可用的八位字节流,因此很抱歉没有进行测试。

关于php - 使用 PHP 或 Django 在 Apache 中重定向八位字节流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30465223/

相关文章:

python - 这些运算符是什么意思(**、^、%、//)?

java - 特定设备可以访问页面,但其他设备不能

php - 如何在 PHP/AJAX/jQuery 中从表单外的 JavaScript 变量保存数据?

php - 搜索 LONGTEXT 字段并显示结果

python - 在 "time data does not match format"捕获无效的月/日

python - python父进程和python子进程的通信

Django复合在多个模型字段上是唯一的

django - 如何获取当前用户的slug?

python - 当模型中的 DateField 过期时触发函数的最佳方式

php - 无法使用 composer 在 laravel 中安装 PHP-FFMpeg/PHP-FFMpeg 库