使用 ws4py 创建自己的应用程序

     2023-02-16     125

关键词:

【中文标题】使用 ws4py 创建自己的应用程序【英文标题】:creating own application using ws4py 【发布时间】:2013-05-25 09:54:49 【问题描述】:

我使用 ws4py 创建了一个 web 服务器套接字,它使用了 cherrypy。当我使用ip:port 连接到服务器时,它可以完美连接并且能够通过多个浏览器聊天。但是,当我尝试连接ip:port/ws 时,它也可以工作。

但是,在我不使用ws 进行连接后,我无法握手。我想处理来自客户端浏览器的所有请求,或者它可能来自不同来源的另一个请求,例如通过此 url ip:port/app 使用 c# 并从客户端发送有效负载。

我已经通过这个命令sudo pip install ws4py 安装了ws4py,我的服务器脚本是:

 # -*- coding: utf-8 -*-
import argparse
import random
import os

import cherrypy

from ws4py.server.cherrypyserver import WebSocketPlugin, WebSocketTool
from ws4py.websocket import WebSocket
from ws4py.messaging import TextMessage

class ChatWebSocketHandler(WebSocket):
    def received_message(self, m):
        print "Message Received---------------------1"
        print m
        cherrypy.engine.publish('websocket-broadcast', m)

    def closed(self, code, reason="A client left the room without a proper explanation."):
        print "Socket Closed---------------------2"
        cherrypy.engine.publish('websocket-broadcast', TextMessage(reason))

class Root(object):
    def __init__(self, host, port, ssl=False):
        print "Rooot host "+str(host)+ " Port "+str(port)+ " -----------3"
        self.host = host
        self.port = port
        self.scheme = 'wss' if ssl else 'ws'

    @cherrypy.expose
    def index(self):
        return """<html>
    <head>
      <script type='application/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'></script>
      <script type='application/javascript'>
        $(document).ready(function() 

          websocket = '%(scheme)s://%(host)s:%(port)s/ws';
          if (window.WebSocket) 
            ws = new WebSocket(websocket);
          
          else if (window.MozWebSocket) 
            ws = MozWebSocket(websocket);
          
          else 
            console.log('WebSocket Not Supported');
            return;
          

          window.onbeforeunload = function(e) 
            $('#chat').val($('#chat').val() + 'Bye bye...\\n');
            ws.close(1000, '%(username)s left the room');

            if(!e) e = window.event;
            e.stopPropagation();
            e.preventDefault();
          ;
          ws.onmessage = function (evt) 
             $('#chat').val($('#chat').val() + evt.data + '\\n');
          ;
          ws.onopen = function() 
             ws.send("%(username)s entered the room");
          ;
          ws.onclose = function(evt) 
             $('#chat').val($('#chat').val() + 'Connection closed by server: ' + evt.code + ' \"' + evt.reason + '\"\\n');
          ;

          $('#send').click(function() 
             console.log($('#message').val());
             ws.send('%(username)s: ' + $('#message').val());
             $('#message').val("");
             return false;
          );
        );
      </script>
    </head>
    <body>
    <form action='#' id='chatform' method='get'>
      <textarea id='chat' cols='35' rows='10'></textarea>
      <br />
      <label for='message'>%(username)s: </label><input type='text' id='message' />
      <input id='send' type='submit' value='Send' />
      </form>

      HI ****************************************************************************

    </body>
    </html>
    """ % 'username': "User%d" % random.randint(0, 100), 'host': self.host, 'port': self.port, 'scheme': self.scheme

    @cherrypy.expose
    def ws(self):
        print ("request for ws------------------------------------------------------4")
        cherrypy.log("Handler created: %s" % repr(cherrypy.request.ws_handler))

    @cherrypy.expose
    def App(self):
        print ("request for App---------------------------------------------5")
        cherrypy.log("Handler created: %s" % repr(cherrypy.request.ws_handler))

if __name__ == '__main__':
    import logging
    from ws4py import configure_logger
    configure_logger(level=logging.DEBUG)

    print " Start Main ----------------------------------------------0"
    parser = argparse.ArgumentParser(description='Echo CherryPy Server')
    parser.add_argument('--host', default='192.x.x.x')
    parser.add_argument('-p', '--port', default=yyyy, type=int)
    parser.add_argument('--ssl', action='store_true')
    args = parser.parse_args()

    cherrypy.config.update('server.socket_host': args.host,
                            'server.socket_port': args.port,
                            'tools.staticdir.root': os.path.abspath(os.path.join(os.path.dirname(__file__), 'static')))

    if args.ssl:
        cherrypy.config.update('server.ssl_certificate': './server.crt',
                                'server.ssl_private_key': './server.key')

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

    cherrypy.quickstart(Root(args.host, args.port, args.ssl), '', config=
        '/ws': 
            'tools.websocket.on': True,
            'tools.websocket.handler_cls': ChatWebSocketHandler
            ,
        '/js': 
              'tools.staticdir.on': True,
              'tools.staticdir.dir': 'js'
            
        
    )

【问题讨论】:

Hai meawoppl 我很高兴你纠正了我的语法如果你解决了我的问题我会更开心 【参考方案1】:

你能准确地说出你的意思吗:

但是,在我使用 ws 连接 whithot 后,我​​无法握手。

你的意思是你以后就不能使用服务器了吗?另外,您只能在此处对 /ws 路径执行 websocket 升级,因为这是您在 sn-p 底部配置它的方式。

【讨论】:

Hai @Sylvain Hellegouarch 感谢您的回复我已经使用 gevent 完成了

使用自己的内容创建动态选项卡

...问题描述】:我正在尝试创建一个动态创建不同选项卡的应用程序,其中有一个根据变量过滤的初始表版本(在CheckboxGroupInput选择的所有选项中)。例如,如果我尝试使用表iris,其中有一个变量Species采用3种模式virginita,setosa和... 查看详情

Laravel 使用 Socialite(google、facebook 等)登录并创建我自己的应用程序的访问令牌

...Laravel使用Socialite(google、facebook等)登录并创建我自己的应用程序的访问令牌【英文标题】:LaravelloginwithSocialite(google,facebook,etc)andcreateanaccesstokenofmyownapp【发布时间】:2019-06-0318:36:50【问题描述】:我正在使用Laravel社交身份验... 查看详情

使用我自己的控件使用 MFC 创建一个 DialogBar

...。我实际上正在开发一个项目,并且正在尝试创建一个SDI应用程序。对,现在我想添加一个可停靠的DialogBar。好吧,我第一次使用资源视图添加它时,我可以毫无 查看详情

ExtJS:如何使用其他 ExtJS 组件创建自己的类?

...用不同的项目创建Panel类对象。基本上它与ExtJS中的桌面应用程序有关。DetailView.jsExt.define("App.view.DetailView",extend:\'Ext.p 查看详情

我使用firebase以角度创建应用程序,如何让每个用户拥有自己的任务表[关闭]

】我使用firebase以角度创建应用程序,如何让每个用户拥有自己的任务表[关闭]【英文标题】:Icreatedapplicationinangularusingfirebase,howtomakepossibleforeachusertohavetheirowntablewithtasks[closed]【发布时间】:2021-02-0200:00:39【问题描述】:我需要... 查看详情

如何使用 java 创建我自己的 STUN 或 TURN 服务器

...用WebRTC并使用JavaWebsocket作为信令服务器来开发视频聊天应用程序。此应用程序在Tomcat上成功运行。目前我正在使用谷歌的STUN服务器。varpc_config="iceServers":["ur 查看详情

创建属于自己的浏览器

...供了托管包装,托管包装使用户可以在Windows窗体客户端应用程序中显示网页,使用WebBrowser控件,可以复制用用程序中的InternetExplorerWeb浏览功能,还可以禁用默认的InternetExplorer功能,并将该控件用做简单的HTML文档查看器,此外... 查看详情

Xcode:仅为我自己的应用程序创建自定义键盘

】Xcode:仅为我自己的应用程序创建自定义键盘【英文标题】:Xcode:Creatingacustomkeyboardjustformyownapp【发布时间】:2015-02-2210:19:55【问题描述】:我正在开发一个数学应用程序。所以我需要一个特定的键盘。我只能使用小数点,但... 查看详情

C# 创建自己的流程图

...述】:在一个项目中,我可能必须创建一个提供流程图的应用程序(.Net/C#4.0)。我正在寻找最好的方法,因为我知道它应该非常灵活:我必须自己使用.Net框架图形(WPF、xaml)吗?是否有一个强大的库可供我使用,专门用于流程图... 查看详情

ios:创建自己的视图

...间】:2011-03-1416:24:50【问题描述】:我才刚刚开始开发iOS应用程序。所以我猜这个问题会是nooby..我正在尝试了解mvc模型在iOS开发中的工作原理。我想混合可用的视图和我自己的视图(我想使用诸如绘制字符串之类的图元自己绘... 查看详情

让用户创建自己的类实例

...建自己的记录。解决这个问题的最佳方法是什么?我可以使用数组或向量作为变量名吗?intRecU[100];classRecord...;intmain()RecordRecU[1];我试过了,我的程序崩溃了,所以我不确定它是否可能 查看详情

跟踪从我自己的类创建的对象

...2018-11-0613:41:37【问题描述】:我有一个扩展eclipse产品的应用程序。让它超时运行,RAM使用量增加到最大堆空间。应用程序不执行任何操作,它只是停留在后台。我运行了JProfiler,然后在LiveMemory部分中,我通过按下Markcurrent按钮... 查看详情

使用 Autodesk A360 中的 URN 创建查看器应用程序

】使用AutodeskA360中的URN创建查看器应用程序【英文标题】:CreatingaviewerapplicationwithanURNfromAutodeskA360【发布时间】:2016-10-1613:16:56【问题描述】:我创建了一个查看器应用程序,它使用2-legged身份验证并显示已上传到我自己的存储... 查看详情

创建自己的 pod 时没有这样的模块“Firebase”

...个名为Experiments的新框架。它为我可以使用它构建的任何应用程序包装FirebaseRemoteConfigAPI。当我运行以下命令podliblintExperiments.podspec时,我得到 查看详情

图解使用idea创建第一个java程序helloworld

...做好了,我们就要开始我们真正的编码学习了。下面介绍使用IDEA创建我们的第一个HelloWorld程序。 1、打开IDEA,创建一个新的项目。 2、在弹出的对话框中,选择Java,第一次使用的时候,要选择我们之前下载好的JDK文件。... 查看详情

创建我自己的 MySQL 数据库 [关闭]

...:是否有任何程序可以让我创建自己的MySQL数据库,最好使用phpmyadmin。这让我可以从外部连接到数据库,并让我编辑它。就像从java中一样,使用JDBC。我已经尝试过wamp,但我似乎无法使用java连接到它。这真是太糟糕了。如果可... 查看详情

Android - 使用我自己的数据使用 parse.com 制作聊天应用程序

】Android-使用我自己的数据使用parse.com制作聊天应用程序【英文标题】:Android-MakeChatapplicationusingparse.comusingmyowndata【发布时间】:2015-12-1209:11:48【问题描述】:我对Android开发非常陌生,对Parse.com也非常陌生。我正在开发一个包... 查看详情

如何创建自己的 npm starter-kit?

...its,例如React带有starter-kit。当用户想要创建一个新的React应用程序时,他们可以使用简写npxcreate-react-appmy-app....自 查看详情