标签: websocket

php websocket棘轮不从学说中获取最新数据

我刚刚在使用 Symfony 4.1 和https://github.com/GeniusesOfSymfony/WebSocketBundle(它建立在 PHP Ratchet 上)构建的WebSocket 应用程序中发现了一个非常有趣的事实。

我想定期从 MySQL 数据库中获取最新数据用于测试目的,$repository->find(2);但它总是返回相同的结果,即使我在订阅 WebSocket 通道时更改数据。

经过相当多的时间弄乱代码并哭泣之后,我发现由于某种原因,Doctrine 正在缓存结果(或者我认为它就是这样做的)。

为了测试我的理论,我创建了一个服务,使用以下代码处理从数据库中获取数据:

/**
 * @return mixed
 * @throws \Doctrine\DBAL\DBALException
 */
public function fetchNewest()
{
    $stmt = $this->em->getConnection()->prepare('SELECT * FROM test WHERE id=2');
    $stmt->execute();

    return $stmt->fetch();
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,这奏效了。谁能解释为什么find(2)方法没有产生最新的数据,而原始 SQL 却产生了?

php doctrine websocket symfony ratchet

1
推荐指数
1
解决办法
564
查看次数

如何在 Python 中异步接收来自多个 WebSocket 的数据?

我目前正在尝试使用websockets 库。如果另一个图书馆更适合此目的,请告诉我。

鉴于这些功能:

def handle_message(msg):
    # do something

async def consumer_handler(websocket, path):
    async for message in websocket:
        handle_message(message)
Run Code Online (Sandbox Code Playgroud)

我如何(无限期地)连接到多个 websockets?下面的代码会起作用吗?

import asyncio
import websockets


connections = set()
connections.add(websockets.connect(consumer_handler, 'wss://api.foo.com', 8765))
connections.add(websockets.connect(consumer_handler, 'wss://api.bar.com', 8765))
connections.add(websockets.connect(consumer_handler, 'wss://api.foobar.com', 8765))

async def handler():
    await asyncio.wait([ws for ws in connections])

asyncio.get_event_loop().run_until_complete(handler())
Run Code Online (Sandbox Code Playgroud)

python asynchronous websocket python-asyncio

1
推荐指数
1
解决办法
4032
查看次数

带有 Nginx 的 SSL websockets 无法连接

有问题,有越来越Nginxproxy_pass使用WebSockets和SSL(WSS)。

NGINX 配置

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

server {
    server_name site.io www.site.io;

    location / {
        proxy_pass         https://localhost:3000;
        proxy_set_header   X-Forwarded-For $remote_addr;
        proxy_set_header   Host $http_host;
    }

    location /ws {
        proxy_pass         http://localhost:8989/graphql;
        proxy_http_version 1.1;
        proxy_set_header   Upgrade $http_upgrade;
        proxy_set_header   Connection "upgrade";
        proxy_set_header   Host $host;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/site.io/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/site.io/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by …
Run Code Online (Sandbox Code Playgroud)

ssl nginx websocket

1
推荐指数
1
解决办法
5419
查看次数

如何在java spring websocket中实现乒乓

根据此处的文档https://tools.ietf.org/html/rfc6455#page-37websocket必须ping使用pong.

我已经实现spring boot websocket处理websocket来自客户端的连接。

我有一个定期websocket发送的客户端ping frames

我在这里/sf/answers/1710682991/发现我无法在 java 中处理 ping 消息。

我对此有疑问-

  1. 我应该处理这些ping请求java spring-boot websocket吗?
  2. 如果是的话,我如何在 Spring Boot 应用程序中实现它并响应ping请求pong

java ping websocket spring-boot spring-websocket

1
推荐指数
1
解决办法
6756
查看次数

如何让 Sanic 响应 http 和 ws?

我有以下代码用于基于此处结合不同端点的 Sanic hello world:

代码是:

from sanic import Sanic
from sanic import response
from sanic.websocket import WebSocketProtocol

app = Sanic()

@app.route("/")
async def test(request):
    return response.json({"hello": "world"})


@app.route('/html')
async def handle_request(request):
    return response.html('<p>Hello world!</p>')

@app.websocket('/feed')
async def feed(request, ws):
    while True:
        data = 'hello!'
        print('Sending: ' + data)
        await ws.send(data)
        data = await ws.recv()
        print('Received: ' + data)

@app.route('/html2')
async def handle_request(request):
  return response.html("""<html><head><script>
         var exampleSocket = new WebSocket("wss://0.0.0.0:8000/feed",      "protocolOne");
         exampleSocket.onmessage = function (event) {
         console.log(event.data)};</script></head><body><h1>Hello socket!</h1><p>hello</p></body></html>""")

app.run(host="0.0.0.0", …
Run Code Online (Sandbox Code Playgroud)

python websocket sanic

1
推荐指数
1
解决办法
1325
查看次数

如何拒绝和关闭 django-channels 2 中的连接?

自从我开始使用 django-channels 已经 1 个月了,现在我觉得我没有正确断开 websockets。当我断开连接时,如果没有人在那里,我想完全摧毁该组,并且它应该没有存在的迹象。当我拒绝连接时,我提出 channels.exceptions.DenyConnection 或发送 {'accepted': 'False'} 我只是想知道这是否是我提到的事情的正确方式。

python django disconnect websocket django-channels

1
推荐指数
2
解决办法
2672
查看次数

使用中间件和 node.js 表达的 Websockets 令牌认证

我使用基于ws 的node.js、express 和express- ws

Express-ws 允许为 websockets 创建类似 express 的端点。

我正在寻找一种基于令牌在 websocket 连接中对用户进行身份验证的解决方案。由于我的 ws 服务器是基于 HTTP 的

const wsHttpServer = http.createServer();
wsHttpServer.listen(5001);
const expressWs = require('express-ws')(app , wsHttpServer);
Run Code Online (Sandbox Code Playgroud)

并且由于 ws 连接基于升级为 ws 的 HTTP 连接,为什么我不能像其他任何连接一样在快速路由检查的 ws 中传递令牌?我的逻辑是,发送令牌,检查它,如果没问题,继续升级到 ws 连接。因此,我可以重用 HTTP 连接中的令牌中间件解决方案。

在节点

我的 ws 服务器

const wsHttpServer = http.createServer();
wsHttpServer.listen(5001);
const expressWs = require('express-ws')(app , wsHttpServer);

//set the route

app.use('/ws', require('./routes/wsroute')); 
Run Code Online (Sandbox Code Playgroud)

在该路线中,我想使用token.validate()中间件 - 在 HTTP 连接中,检查 Authorization 标头

router.ws('/user/:name/:id', token.validate(),  (ws, req) => { 
    console.log('ws …
Run Code Online (Sandbox Code Playgroud)

authentication token websocket node.js express

1
推荐指数
1
解决办法
6547
查看次数

如何在带有客户端渲染器的服务器上使用 Matter.js

我正在写一个多人游戏。有没有什么快速的方法可以在服务器上使用 MatterJS(使用nodejs, ws, express)。我的主要问题是将世界从服务器发送到客户端以在画布上渲染它。由于世界困难,有没有什么方法可以Matter.Engine在前端使用内置?
有人可以帮忙吗?


如果这个问题有点不详细,请在评论中写下问题。

javascript websocket matter.js

1
推荐指数
1
解决办法
912
查看次数

如何一次将数据发送到多个通道?(laravel,广播)

我有一个广播事件,客户端有订阅频道:

/**
* Get the channels the event should broadcast on.
*
* @return PrivateChannel
*/
public function broadcastOn()
{
    return new PrivateChannel("user.{$this->userId}");
}
Run Code Online (Sandbox Code Playgroud)

如何一次将数据发送到多个通道(在 user.1、user.2、user.3 ...上)?

细化,针对特定用户,而不是针对已订阅房间的每个人。

queue websocket redis laravel laravel-echo

1
推荐指数
1
解决办法
563
查看次数

Websocket 客户端未收到任何消息

我有 Python 客户端,它打开到服务器的 websocket 连接并使用 STOMP 协议订阅特定主题,订阅进行得很好,因为我在服务器上看到一切都很好。但是,当服务器发布一些消息时,客户端不会收到任何消息。以下是使用的代码:

客户

# coding: utf-8
import websocket
import stomp
import stomper
token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsInByaW5jaXBhbF9uYW1lIjoiYWRtaW4iLCJpc3MiOiJBdGhlbmEiLCJ1c2VydHlwZSI6IkxPQ0FMIiwiYW9zX3ZlcnNpb24iOiJldXBocmF0ZXMtNS4xMS1zdGFibGUiLCJyZWdpb24iOiJlbi1VUyIsImV4cCI6MTczNDI4MDI3NywidXVpZCI6ImI4MzhjOGRkLWI4NmQtNGNkZS05ZTE4LTUxM2E1OTk4ODhhYyIsImlhdCI6MTU3NjYwMDI3NywiYXV0aG9yaXRpZXMiOiJST0xFX0NMVVNURVJfQURNSU4sUk9MRV9NVUxUSUNMVVNURVJfQURNSU4sUk9MRV9VU0VSX0FETUlOLFJPTEVfQ0xVU1RFUl9WSUVXRVIiLCJqdGkiOiI1NTU1ZjEwZC04NGQ5LTRkZGYtOThhNC1mZmI1OTM1ZTQwZWEifQ.LOMX6ppkcSBBS_UwW9Qo2ieWZAGrKqADQL6ZQuTi2oieYa_LzykNiGMWMYXY-uw40bixDcE-aVWyrIEZQbVsvA"
headers = {"Authorization": "Bearer " + token}
uri = "ws://127.0.0.1:8765/notifications/websocket"
def on_msg(ws, msg):
    print(msg)

def on_error(ws, err):
    print(err)

def on_closed(ws):
    print("#Closed#")

def on_open(ws):
    sub = stomper.subscribe("/user/queue/alert", "MyuniqueId", ack="auto")
    ws.send(sub)

headers = {"Authorization": "Bearer " + token}



websocket.enableTrace(True)
ws = websocket.WebSocketApp(uri, header=headers, on_message=on_msg, on_error=on_error, on_close=on_closed)
ws.on_open = on_open
ws.run_forever()
Run Code Online (Sandbox Code Playgroud)

代码服务器用于发布消息:

    for (WatchesSubscription s : subscriptions) {
            template.convertAndSendToUser(s.getSession().getUser(), destination, dto);
        }
Run Code Online (Sandbox Code Playgroud)

当我检查上述变量的值时,我看到目的地是预期的 …

python stomp websocket spring-websocket

1
推荐指数
1
解决办法
2067
查看次数