【问题标题】:Getting phantomjs, socket.io and gevent-socketio to work together让 phantomjs、socket.io 和 gevent-socketio 一起工作
【发布时间】:2013-03-31 00:56:08
【问题描述】:

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

问题是 Phantomjs 和我的 Python 程序这两个进程需要双向通信。问题是在page.evaluate 里面我不能:

  • 传递任何复杂对象,例如“fs”(从标准输入读取)
  • 创建一个 WebSocket 来连接我的 Python 脚本
  • 任何其他形式的进程间通信都受到限制

所以我的解决方案很简单:

  • 将 socket.io js 注入我正在查看的页面。
  • 连接到我使用 gevent-socketio 实现的 python 服务器

当我尝试从 page.evaluate 内部连接时,我得到:

Unexpected response code: 404

这是 Phantomjs 脚本:

var page   = require("webpage").create();
page.onAlert = function(msg) { console.log("alert>>>" + msg); };
page.onConsoleMessage= function(msg) { console.log(msg); };

page.open("http://google.com", function() {
  page.injectJs("socket.io.js");
  page.evaluate(function() {
    var socket = new io.Socket();
    socket.connect('localhost:5051/test');
    socket.on('connect',function() {
      console.log('Client has connected to the server!');
    });
    // Add a connect listener
    socket.on('signal',function(data) {
      console.log('Received a signal: ',data);
    });
    // Add a disconnect listener
    socket.on('disconnect',function() {
      console.log('The client has disconnected!');
    });
    // Sends a message to the server via sockets
    socket.send("kakalq");
  });
    //phantom.exit();
});

这是服务器端 Python 脚本:

from socketio import socketio_manage
from socketio.server import SocketIOServer
from socketio.namespace import BaseNamespace

class MyNs(BaseNamespace):
  def initialize(self):
    print "connected"
    self.emit('connect')

  def disconnect(self, *args, **kwargs):
    print "diconnecting"
    super(MyNs, self).disconnect(*args, **kwargs)

 def signal(self, message):
   print "received signal", message
   self.emit("okay", "this will be sent to js")

 def start(environ, start_response):
   if environ['PATH_INFO'].startswith('/test'):
     return socketio_manage(environ, { '/test': MyNs })


if __name__ == "__main__":
  server = SocketIOServer( ('', 5051), start,policy_server=False )
  server.serve_forever()

【问题讨论】:

  • dev,您可以尝试简化您的问题,以便其他人更容易理解您的问题并识别错误。 page.injectJs("socket.io.js") 看起来很可疑:因为它是一个相对链接,它会引用http://www.google.com/socket.io.js。尝试将其引用为http://localhost/socket.io.js。
  • @ren-dev 你找到解决方案了吗?请看stackoverflow.com/questions/19866764/…

标签: websocket socket.io phantomjs gevent-socketio


【解决方案1】:

我猜为什么它不起作用是 PhantomJS 只支持旧的、已弃用的 WebSockets 版本。 PhantomJS 2.0 需要几个月的时间才能支持当前版本的 WebSockets。

【讨论】:

  • 对于 node.js socket.io 服务器,我们可以将服务器配置为仅通过某些协议进行侦听-例如仅通过 xhr 轮询-也许这可以帮助 OP 解决 websockets 的问题,不是吗? python socketio库是否提供这种配置?
猜你喜欢
  • 2018-12-30
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
  • 2018-04-13
  • 2018-07-18
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
相关资源
最近更新 更多