Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ws4py-发送/接收的\u消息不工作_Javascript_Python_Python 3.x_Cherrypy_Ws4py - Fatal编程技术网

Javascript ws4py-发送/接收的\u消息不工作

Javascript ws4py-发送/接收的\u消息不工作,javascript,python,python-3.x,cherrypy,ws4py,Javascript,Python,Python 3.x,Cherrypy,Ws4py,我在制作WebSocket服务器/客户端时遇到了一些问题 这是我的WebSocket课程: wslist = [] class LoginLiveWebSocketHandler(WebSocket): # /live/ws/zones loggedon = False def opened(self): log("Opened!") wslist.append(self) def received_message(self, m)

我在制作WebSocket服务器/客户端时遇到了一些问题

这是我的WebSocket课程:

wslist = []

class LoginLiveWebSocketHandler(WebSocket):  # /live/ws/zones
    loggedon = False

    def opened(self):
        log("Opened!")
        wslist.append(self)

    def received_message(self, m):
        log("Received Message!")
        log(m)
        log(m.data)
        m = str(m.data)
        if not m.startswith("Login: ") & (not self.loggedon):
            return
        if m.startswith("Login: ") & self.loggedon:
            return
        if m.startswith("Login: ") & (not self.loggedon):
            split = m.replace("Login: ", "").split(":")
            try:
                id = split[0]
                key = split[1]
            except KeyError:
                self.send("Login: 0", False)
                return
            try:
                usr = users.getuser(id, key)
                nick = usr["nick"]
                loggedin = True
                token = usr["groupme_token"]
                active = usr["active"]
            except KeyError or TypeError:
                self.send("Login: 0", False)
                return
            if (not loggedin) | (not active) | (not local.token) | (local.user["faction"] != "f"):
                self.send("Login: 0", False)
                return
            self.send("Login: 1", False)
            self.loggedon = True
            return

    def closed(self, code, reason=""):
        log("Closed!")
        wslist.remove(self)
和我的JavaScript页面(注意,不是全部):

安装服务:

log("Starting WebServer (cherrypy)")
cherrypy.server.unsubscribe()
if config.DO_SSL is True:
    server1 = cherrypy._cpserver.Server()
    server1.socket_port = config.LISTEN_PORT_SSL
    server1._socket_host = config.LISTEN
    server1.thread_pool = 30
    server1.ssl_certificate = config.SSL_CERTIFICATE
    server1.ssl_private_key = config.SSL_PRIVATE_KEY
    server1.ssl_certificate_chain = config.SSL_CHAIN
    server1.ssl_module = config.SSL_HANDLER
    server1.subscribe()
server2 = cherrypy._cpserver.Server()
server2.socket_port = config.LISTEN_PORT
server2._socket_host = config.LISTEN
server2.thread_pool = 30
server2.subscribe()

WebSocketPlugin(cherrypy.engine).subscribe()
cherrypy.tools.websocket = WebSocketTool()

cherrypy.tree.mount(APIService.APIService(), "/api", config={"/": {'error_page.404': APIService.ep}})
cherrypy.tree.mount(JSONService.JSONService(), "/json", config={"/": {'error_page.404': JSONService.ep}})
cherrypy.tree.mount(USRAPIService.USRAPIService(), "/usrapi", config={"/": {'error_page.404': USRAPIService.ep}})
cherrypy.tree.mount(USRAPIAdminService.USRAPIAdminService(), "/usrapi/admin", config={
    "/": {'error_page.404': USRAPIService.ep}})
cherrypy.tree.mount(RootService.RootService(), "/", config={"/": {'error_page.404': RootService.ep}})
cherrypy.tree.mount(AdminService.AdminService(), "/admin", config={"/": {'error_page.404': AdminService.ep}})
cherrypy.tree.mount(HelperPanel.HelperPanel(), "/helper", config={"/": {'error_page.404': HelperPanel.ep}})
cherrypy.tree.mount(LiveService.LiveService(), "/live", config={"/": {'error_page.404': LiveService.ep},
                                                                "/ws_zones": {'tools.websocket.on': True,
                                                                              'tools.websocket.handler_cls':
                                                                                  LiveService.LoginLiveWebSocketHandler
                                                                              }})
cherrypy.tree.mount(None, "/static", config={"/": {'error_page.404': AdminService.ep,
                                                   'tools.staticdir.on': True,
                                                   'tools.staticdir.dir':
                                                       os.path.join(__current_dir, "web/static")}})
cherrypy.engine.start()
log("Started WebServer (cherrypy)")
现场服务:

class LiveService(object):

    @cherrypy.expose
    @require(level=0)
    def index(self, user, usrname, usrhelper, usradmin):
        return render("index", usrname, usrhelper, usradmin)

    @cherrypy.expose
    @require(level=4)  # Require login, Groupme, active and faceless
    def live(self, user, usrname, usrhelper, usradmin):
        return render("websocket/zonesdata", usrname, usrhelper, usradmin)

    @cherrypy.expose
    def ws_zones(self):
        log("Handler created: %s" % repr(cherrypy.request.ws_handler))
        cherrypy.request.ws_handler.send(b"Login 0", False)
因此,安装和启动工作已经开始,整个生产运行了几个月,但是新的带有ws的LiveService不起作用。 在日志中,我收到
[21/Jul/2015:16:55:28]引擎启动WebSocket处理
打开的
消息,但我从未收到或能够发送消息。 当我将LiveService.LoginLiveServiceWebSocketHandler更改为EchoWebSocket时,他会获取消息并发送它们,但是在ws_区域处理程序上

cherrypy.request.ws_handler.send(b“Login 0”,False)

它不起作用。是否使用b。

分析 首先要说的是,您应该注意调试您可以使用的工具。例如,当您在Firefox中尝试应用程序时,Firebug(或Web控制台)会告诉您:

Firefox无法在ws://127.0.0.1:8080/live/ws_区域建立与服务器的连接

Chromium控制台有更有用的错误消息:

到“ws://127.0.0.1:8080/live/ws_zones”的WebSocket连接失败:WebSocket握手期间出错:状态行无效

好的,我们有一个握手问题

如果你打开Wireshark(或其他嗅探器),你会看到我们的
Login 0
确实出现在
ws4py
以握手回应之前(或者可能存在竞争条件)

我可以理解您的困惑,因为在一些地方,
ws4py
文档或者暗示或者直接引导您走错了路。让我们看看:

-无法从普通处理程序发送

@cherrypy.expose
def ws(self):
    # you can access the class instance through
    handler = cherrypy.request.ws_handler
-您不能从
打开的
钩子发送

def opened(self):
    """
    Called by the server when the upgrade handshake
    has succeeeded.
    """
    pass
所以我认为这要么是一个过时的文档,要么是一个bug

解决方案 现在,我建议你们在客户端开始沟通。如果您有一些预先登录的“聊天”,您可以在web套接字上创建一个小协议(您最终还是会这样做)。大概是这样的:

#!/usr/bin/env python3


import json

import cherrypy
from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
from ws4py.websocket import WebSocket


class LoginLiveWebSocketHandler(WebSocket):

  wsset = set()
  '''Class level attr, do not rebind'''


  def opened(self):
    '''You can not send yet, because handshake has not been completed.
    Yes, a documentation is not always correct ;-)
    '''

    cherrypy.log('Opened!')
    self.wsset.add(self)

  def closed(self, code, reason = ''):
    cherrypy.log('Closed!')
    self.wsset.remove(self)

  def received_message(self, message):
    cherrypy.log('Received Message!')

    message = json.loads(message.data.decode())
    if message['cmd'] == 'init':
      self.send('Login 0')
    else:
      self.send(message['payload'] + ' pong')


class LiveService(object):

  @cherrypy.expose
  def index(self):
    return '''<!DOCTYPE html>
      <html>
      <body>
        <div id='log'></div>
        <script type='application/javascript'>
          var ws = new WebSocket('ws://127.0.0.1:8080/live/ws_zones');

          ws.onopen = function(event)
          {
            ws.send(JSON.stringify({'cmd': 'init'}));
          };
          ws.onmessage = function(event)
          {
            document.getElementById('log').innerHTML += event.data + '<br/>';
          };

          var handle = setInterval(function()
          {
            if(ws.readyState == WebSocket.CLOSING || ws.readyState == WebSocket.CLOSED)
            {
              clearInterval(handle);
            }
            else
            {
              ws.send(JSON.stringify({'cmd': 'chat', 'payload': 'ping'}));
            }
          }, 1000);
          </script>
      </body>
      </html>
    '''

  @cherrypy.expose
  def ws_zones(self):
    '''You can not send yet, because handshake has not been completed'''
    cherrypy.log('Handler created: %r' % cherrypy.request.ws_handler)



if __name__ == '__main__':
  cherrypy.config.update({
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  })

  cherrypy.tools.websocket = WebSocketTool()
  WebSocketPlugin(cherrypy.engine).subscribe()

  cherrypy.tree.mount(LiveService(), '/live', {
    '/ws_zones' : {
      'tools.websocket.on'          : True,
      'tools.websocket.handler_cls' : LoginLiveWebSocketHandler
    }
  })

  cherrypy.engine.signals.subscribe()
  cherrypy.engine.start()
  cherrypy.engine.block()
#/usr/bin/env蟒蛇3
导入json
进口樱桃
从ws4py.server.cherrypyserver导入WebSocketPlugin、WebSocketTool
从ws4py.websocket导入websocket
类LoginLiveWebSocketHandler(WebSocket):
wsset=set()
''类级属性,不重新绑定''
def打开(自):
''您还不能发送,因为握手尚未完成。
是的,文档并非总是正确的;-)
'''
cherrypy.log('Opened!')
self.wsset.add(self)
def关闭(自身、代码、原因=“”):
cherrypy.log('Closed!')
self.wsset.remove(self)
def收到_消息(自我,消息):
cherrypy.log('Received Message!')
message=json.load(message.data.decode())
如果消息['cmd']='init':
self.send('Login 0')
其他:
self.send(消息['payload']+'pong')
类LiveService(对象):
@樱桃树
def索引(自):
返回“”'
var ws=newwebsocket('ws://127.0.0.1:8080/live/ws_zones');
ws.onopen=函数(事件)
{
send(JSON.stringify({'cmd':'init'}));
};
ws.onmessage=函数(事件)
{
document.getElementById('log').innerHTML+=event.data+'
'; }; var handle=setInterval(函数() { if(ws.readyState==WebSocket.CLOSING | | ws.readyState==WebSocket.CLOSING) { 间隙(手柄); } 其他的 { send(JSON.stringify({'cmd':'chat','payload':'ping'); } }, 1000); ''' @樱桃树 def ws_区域(自): ''您还不能发送,因为握手尚未完成'' cherrypy.log('创建的处理程序:%r'%cherrypy.request.ws\u处理程序) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': cherrypy.config.update({ 'server.socket_host':'127.0.0.1', 'server.socket_port':8080, “服务器线程池”:8 }) cherrypy.tools.websocket=WebSocketTool() WebSocketPlugin(cherrypy.engine).subscribe() mount(LiveService(),“/live”{ “/ws_区域”:{ 'tools.websocket.on':True, 'tools.websocket.handler_cls':LoginLiveWebSocketHandler } }) cherrypy.engine.signals.subscribe() cherrypy.engine.start() cherrypy.engine.block()
有点愚蠢

@saaj是对的,但真正的问题是,我试图用m、m.data等调用函数log(需要str)。使用repr()或删除它都能成功


谢谢

显示您的
LiveService.LiveService
。谢谢!现在就要努力做到这一点!
#!/usr/bin/env python3


import json

import cherrypy
from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
from ws4py.websocket import WebSocket


class LoginLiveWebSocketHandler(WebSocket):

  wsset = set()
  '''Class level attr, do not rebind'''


  def opened(self):
    '''You can not send yet, because handshake has not been completed.
    Yes, a documentation is not always correct ;-)
    '''

    cherrypy.log('Opened!')
    self.wsset.add(self)

  def closed(self, code, reason = ''):
    cherrypy.log('Closed!')
    self.wsset.remove(self)

  def received_message(self, message):
    cherrypy.log('Received Message!')

    message = json.loads(message.data.decode())
    if message['cmd'] == 'init':
      self.send('Login 0')
    else:
      self.send(message['payload'] + ' pong')


class LiveService(object):

  @cherrypy.expose
  def index(self):
    return '''<!DOCTYPE html>
      <html>
      <body>
        <div id='log'></div>
        <script type='application/javascript'>
          var ws = new WebSocket('ws://127.0.0.1:8080/live/ws_zones');

          ws.onopen = function(event)
          {
            ws.send(JSON.stringify({'cmd': 'init'}));
          };
          ws.onmessage = function(event)
          {
            document.getElementById('log').innerHTML += event.data + '<br/>';
          };

          var handle = setInterval(function()
          {
            if(ws.readyState == WebSocket.CLOSING || ws.readyState == WebSocket.CLOSED)
            {
              clearInterval(handle);
            }
            else
            {
              ws.send(JSON.stringify({'cmd': 'chat', 'payload': 'ping'}));
            }
          }, 1000);
          </script>
      </body>
      </html>
    '''

  @cherrypy.expose
  def ws_zones(self):
    '''You can not send yet, because handshake has not been completed'''
    cherrypy.log('Handler created: %r' % cherrypy.request.ws_handler)



if __name__ == '__main__':
  cherrypy.config.update({
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  })

  cherrypy.tools.websocket = WebSocketTool()
  WebSocketPlugin(cherrypy.engine).subscribe()

  cherrypy.tree.mount(LiveService(), '/live', {
    '/ws_zones' : {
      'tools.websocket.on'          : True,
      'tools.websocket.handler_cls' : LoginLiveWebSocketHandler
    }
  })

  cherrypy.engine.signals.subscribe()
  cherrypy.engine.start()
  cherrypy.engine.block()