Websocket 让phantomjs、socket.io和gevent socketio协同工作

Websocket 让phantomjs、socket.io和gevent socketio协同工作,websocket,socket.io,phantomjs,gevent-socketio,Websocket,Socket.io,Phantomjs,Gevent Socketio,我试图构建一个应用程序,利用Phantomjs 1.7(模拟浏览器)并创建一个Python后端来触发一些事件并收集数据 问题是Phantomjs和我的Python程序这两个进程需要双向通信。问题是在页面内。评估我无法: 传递任何复杂对象,如“fs”(从stdin读取) 创建一个WebSocket以连接到我的Python脚本 任何其他形式的进程间通信都受到限制 因此,我的解决方案很简单: 将socket.io js注入我正在查看的页面 连接到使用gevent socketio实现的pytho

我试图构建一个应用程序,利用Phantomjs 1.7(模拟浏览器)并创建一个Python后端来触发一些事件并收集数据

问题是Phantomjs和我的Python程序这两个进程需要双向通信。问题是在
页面内。评估
我无法:

  • 传递任何复杂对象,如“fs”(从stdin读取)
  • 创建一个WebSocket以连接到我的Python脚本
  • 任何其他形式的进程间通信都受到限制
因此,我的解决方案很简单:

  • 将socket.io js注入我正在查看的页面
  • 连接到使用gevent socketio实现的python服务器
当我尝试从page.evaluate内部连接时,我得到:

Unexpected response code: 404
以下是Phantomjs脚本:

var page=require(“网页”).create();
page.onAlert=函数(msg){console.log(“警报>>>”+msg);};
page.onConsoleMessage=function(msg){console.log(msg);};
第页打开(“http://google.com“,函数(){
page.injectJs(“socket.io.js”);
page.evaluate(函数(){
var socket=新io.socket();
socket.connect('localhost:5051/test');
socket.on('connect',function(){
log('客户端已连接到服务器!');
});
//添加一个连接侦听器
socket.on('信号'),功能(数据){
log('接收到信号:',数据);
});
//添加一个断开连接的侦听器
socket.on('disconnect',function()){
log('客户端已断开连接!');
});
//通过套接字向服务器发送消息
socket.send(“kakalq”);
});
//phantom.exit();
});
下面是服务器端Python脚本:

从socketio导入socketio\u管理
从socketio.server导入SocketIOServer
从socketio.namespace导入BaseNamespace
类MyNs(BaseNamespace):
def初始化(自):
打印“已连接”
self.emit('connect')
def断开连接(自,*args,**kwargs):
打印“双连接”
超级(MyNs,self)。断开连接(*args,**kwargs)
def信号(自身、信息):
打印“接收到的信号”,信息
emit(“好的”,“这将被发送到js”)
def启动(环境、启动和响应):
如果环境['PATH_INFO'].startswith('/test'):
返回socketio_manage(环境,{'/test':MyNs})
如果名称=“\uuuuu main\uuuuuuuu”:
服务器=SocketIOServer((“”,5051),开始,策略\u服务器=False)
服务器。永远为您服务()

我猜为什么它不起作用,是因为PhantomJS只支持旧的、不推荐使用的WebSocket版本。PhantomJS 2.0还需要几个月才能支持当前版本的WebSocket。

dev,您可以尝试简化您的问题,让其他人更容易理解您的问题并识别错误。page.injectJs(“socket.io.js”)看起来可疑:因为它是一个相对链接,所以会引用
http://www.google.com/socket.io.js
。尝试将其引用为
http://localhost/socket.io.js
@ren dev您找到解决方案了吗?请参阅node.js socket.io服务器,我们可以将服务器配置为仅通过某些协议进行侦听,例如仅通过xhr轮询。这可能有助于OP解决WebSocket的问题,不是吗?python socketio库是否提供这种配置?