百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Tornado WebSocket(gametornado破解版)

ccwgpt 2024-10-14 08:42 39 浏览 0 评论

Tornado 是一个 Python web 框架和异步网络库,最初由 FriendFeed 开发。通过使用非阻塞网络 I/O,Tornado可以扩展到数万个开放连接,使其成为长轮询、WebSocket 和其他需要与每个用户建立长期连接的应用程序的理想选择。

Tornado 大致可分为三个主要部分:

  • 一个web框架(包括被子类化以创建 web 应用程序的 RequestHandler,以及各种支持类)
  • HTTP的客户端和服务器端实现(HTTPServer和AsyncHTTPClient)
  • 一个异步网络库,包括IOLoop和IOStream类,它们作为HTTP组件的构建块,也可用于实现其他协议

Tornado web 框架和 HTTP 服务器一起提供了 WSGI 的全栈替代方案。虽然可以将 Tornado HTTP 服务器用作其他WSGI框架(WSGIContainer)的容器,但这种组合存在局限性,为了充分利用 Tornado,您需要同时使用Tornado 的 web 框架和 HTTP 服务器。

1.tornado.websocket - 与浏览器的双向通信

WebSockets 允许浏览器和服务器之间的双向通信。所有主要浏览器的当前版本都支持 WebSocket,尽管不支持WebSockets 的旧版本仍在使用。

此模块实现了 RFC 6455 中定义的 WebSocket 协议的最终版本。某些浏览器版本(特别是Safari 5.x)实现了协议的早期草稿(称为“草稿76”),并且与此模块不兼容。

该模块提供了一个 WebSocketHandler 类用来处理通信。该类的方法:

  • WebSocketHandler.open()

当一个 WebSocket 连接建立后被调用。

  • WebSocketHandler.on_message(message)

当客户端发送消息 message 过来时被调用,注意此方法必须被重写。

  • WebSocketHandler.on_close()

当 WebSocke t连接关闭后被调用。

  • WebSocketHandler.write_message(message, binary=False)

向客户端发送消息 messagea,message可以是字符串或字典(字典会被转为json字符串)。若 binary 为False,则 message 以 utf8 编码发送;二进制模式(binary=True)时,可发送任何字节码。

  • WebSocketHandler.close()

关闭 WebSocket 连接。

  • WebSocketHandler.check_origin(origin)

判断源origin,对于符合条件(返回判断结果为True)的请求源origin允许其连接,否则返回 403。可以重写此方法来解决 WebSocket 的跨域请求(如始终return True)

要接受所有跨源流量,只需重写此方法以始终返回True:

def check_origin(self, origin):
    return True

要允许从站点的任何子域进行连接,您可以执行以下操作:

def check_origin(self, origin):
    parsed_origin = urllib.parse.urlparse(origin)
    return parsed_origin.netloc.endswith(".mydomain.com")

要实现一个 WebsocketServer ,我们需要继承 WebSocketHandler 类并重写如下方法即可:

  • open
  • on_message
  • close
  • check_origin

2.示例

服务端代码:

# coding: utf-8
import tornado.escape
import tornado.ioloop
import tornado.web
import tornado.websocket
import tornado.options
import tornado.httpserver
import asyncio


class EchoWebSocket(tornado.websocket.WebSocketHandler):
    def open(self):
        # 客户端 IP
        print('客户端 IP: %s' % self.request.remote_ip)
        # 客户端 IP 端口
        print('客户端 %s 建立连接' % str(self.request.connection.context.address))
        print("WebSocket opened")

    def on_message(self, message):
        print(message)
        self.write_message("You said: " + message)

    def on_close(self):
        # 客户端 IP
        print('客户端 IP: %s' % self.request.remote_ip)
        # 客户端 IP 端口
        print('客户端 %s 断开连接' % str(self.request.connection.context.address))
        print("WebSocket closed")

    def check_origin(self, origin: str):
        return True


async def main(port):
    application = tornado.web.Application([(r"/", EchoWebSocket),])
    application.listen(port)
    await asyncio.Event().wait()

if __name__ == "__main__":
    print('服务端启动于:%s' % 8888)
    asyncio.run(main(8888))

客户端代码:

pip install websocket-client

客户端需要安装 websocket-client

# coding: utf-8
import time
from websocket import create_connection


ws = create_connection("ws://127.0.0.1:8888")

print ("Sending 'Hello World'...")
for i in range(1, 10):
    time.sleep(2)
    ws.send("Hello World %s" % i)
    print ("发送 %s" % i)
    print ("接收...%s" % i)
    result = ws.recv()
    print ("接收到 '%s'" % result)

time.sleep(2)
ws.close()

3.运行结果

服务端:

服务端启动于:8888
客户端 IP: 127.0.0.1
客户端 ('127.0.0.1', 52837) 建立连接
WebSocket opened
Hello World 1
Hello World 2
Hello World 3
Hello World 4
Hello World 5
Hello World 6
Hello World 7
Hello World 8
Hello World 9
客户端 IP: 127.0.0.1
客户端 ('127.0.0.1', 52837) 断开连接
WebSocket closed

客户端:

Sending 'Hello World'...
发送 1
接收...1
接收到 'You said: Hello World 1'
发送 2
接收...2
接收到 'You said: Hello World 2'
发送 3
接收...3
接收到 'You said: Hello World 3'
发送 4
接收...4
接收到 'You said: Hello World 4'
发送 5
接收...5
接收到 'You said: Hello World 5'
发送 6
接收...6
接收到 'You said: Hello World 6'
发送 7
接收...7
接收到 'You said: Hello World 7'
发送 8
接收...8
接收到 'You said: Hello World 8'
发送 9
接收...9
接收到 'You said: Hello World 9'



相关推荐

MFC、Qt、WPF?该用哪个?(mfc和wpf区别)

MFC、Qt和WPF都是流行的框架和工具,用于开发图形用户界面(GUI)应用程序。选择哪个框架取决于你的具体需求和偏好。MFC(MicrosoftFoundationClass)是微软提供的框架,...

一款WPF开发的通讯调试神器(支持Modbus RTU、MQTT调试)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍Wu.CommTool是一个基于C#、WPF、Prism、MaterialDesign...

关于面试资深C#、WPF开发工程师的面试流程和问题

一、开场(2-3分钟)1.欢迎应聘者,简单介绍公司和面试流程。2.询问应聘者是否对公司或岗位有初步的问题。二、项目经验与技术应用(10-20分钟)1.让应聘者详细介绍几个他参与过的C#、...

C# WPF MVVM模式Prism框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Prism提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行...

WPF 机械类组件动画制作流程简述(wps上怎么画机械结构简图)

WPF机械类组件动画制作流程简述独立观察员2025年3月4日一、创建组件创建组件用户控件,将组件的各部分“零件”(图片)拼装在一起,形成组件的默认状态:二、给运动部分加上Rend...

C#上位机WinForm和WPF选哪个?工控老油条的"血泪史"

作为一个从互联网卷进工控坑的"跨界难民",在这会摸鱼的时间咱就扯一下上位机开发选框架这档子破事。当年我抱着WPF的酷炫动画一头扎进车间,结果被产线老师傅一句"你这花里胡哨的玩意...

【一文扫盲】WPF、Winform、Electron有什么区别?

近年来,随着软件开发的不断发展,开发人员面临着选择适合他们项目的各种框架和工具的挑战。在桌面应用程序开发领域,WPF、Winform和Electron是三个备受关注的技术。本文将介绍这三者的区别,帮助...

一个开源、免费、强大且美观的WPF控件库

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!项目介绍HandyControl是一套基于WPF(WindowsPresentationF...

WPF 根据系统主题自动切换浅色与深色模式

WPF根据系统主题自动切换浅色与深色模式控件名:Resources作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopers...

WPF与WinForm的本质区别(wpf与maui)

在Windows应用程序开发中,WinForm和WPF是两种主要的技术框架。它们各自有不同的设计理念、渲染机制和开发模式。本文将详细探讨WPF与WinForm的本质区别,并通过示例进行说明。渲染机制W...

Win10/Win11效率神器再进化:微软发布PowerToys 0.90.0版本

IT之家4月1日消息,微软今天(4月1日)更新PowerToys,在最新发布的0.90.0版本中,修复多个BUG之外,引入多项功能更新,为Windows10、Windows...

一款非常漂亮的WPF管理系统(wpf架构及特性)

我们致力于探索、分享和推荐最新的实用技术栈、开源项目、框架和实用工具。每天都有新鲜的开源资讯等待你的发现!WPFManager项目介绍该项目是一款WPF开发的管理系统,数据库采用的MSSqlserv...

WPF 实现描点导航(wpf按钮的点击事件)

WPF实现描点导航控件名:NavScrollPanel作者:WPFDevelopersOrg-驚鏵原文链接[1]:https://github.com/WPFDevelopersOrg/WPF...

微软更新基于Win11的Validation OS 2504:增强 .NET与WPF

IT之家5月1日消息,科技媒体NeoWin今天(5月1日)发布博文,报道称微软公司更新基于Windows11的ValidationOS,增强支持.NET和WPF,并优...

WPF的技术架构与优势(wpf的前景)

WindowsPresentationFoundation(WPF)是一个现代化的用户界面框架,专为构建Windows应用程序而设计。它通过分层的技术架构和丰富的功能集,提供了全面的应用程...

取消回复欢迎 发表评论: