我刚刚在使用 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 却产生了?
我目前正在尝试使用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) 有问题,有越来越Nginx来proxy_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) 根据此处的文档https://tools.ietf.org/html/rfc6455#page-37,websocket必须ping使用pong.
我已经实现spring boot websocket处理websocket来自客户端的连接。
我有一个定期websocket发送的客户端ping frames。
我在这里/sf/answers/1710682991/发现我无法在 java 中处理 ping 消息。
我对此有疑问-
ping请求java spring-boot websocket吗?ping请求pong?我有以下代码用于基于此处结合不同端点的 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) 自从我开始使用 django-channels 已经 1 个月了,现在我觉得我没有正确断开 websockets。当我断开连接时,如果没有人在那里,我想完全摧毁该组,并且它应该没有存在的迹象。当我拒绝连接时,我提出 channels.exceptions.DenyConnection 或发送 {'accepted': 'False'} 我只是想知道这是否是我提到的事情的正确方式。
我使用基于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) 我正在写一个多人游戏。有没有什么快速的方法可以在服务器上使用 MatterJS(使用nodejs, ws, express)。我的主要问题是将世界从服务器发送到客户端以在画布上渲染它。由于世界困难,有没有什么方法可以Matter.Engine在前端使用内置?
有人可以帮忙吗?
我有一个广播事件,客户端有订阅频道:
/**
* 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 ...上)?
细化,针对特定用户,而不是针对已订阅房间的每个人。
我有 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)
当我检查上述变量的值时,我看到目的地是预期的 …
websocket ×10
python ×4
asynchronous ×1
disconnect ×1
django ×1
doctrine ×1
express ×1
java ×1
javascript ×1
laravel ×1
laravel-echo ×1
matter.js ×1
nginx ×1
node.js ×1
php ×1
ping ×1
queue ×1
ratchet ×1
redis ×1
sanic ×1
spring-boot ×1
ssl ×1
stomp ×1
symfony ×1
token ×1