我是 websockets 的新手。我刚刚完成了我的第一个多用途套接字服务器,它在同一个套接字中提供 3 种类型的消息。此服务器的预期用途如下:
chat messages
real time market data
user specific alerts
前两个功能运行良好,我非常高兴,但是在识别和链接特定帐户连接中的对等点时,我完全不知所措,以便我可以向特定用户提供待处理的警报通知。
基本上,我将警报消息存储在数据库表中,如下所示:
Table: uc_notifications
account(varchar50) | message(varchar255) | id(primary,AI) | seen(default 0)
我想像这样将对等点存储在一个表中:
uc_notification_peers
account(varchar50) | peer_id(unique,varchar100) | id(primary,AI)
基本上,我遇到的问题是将对等方的信息存储在数据库中,然后检索它,这样我就可以在读取通知表时将消息发送给选定的对等方。脚本中的其他所有内容均有效。
我尝试的第一件事是使用 onopen 将帐户名传递给 websocket。这会使 websocket 崩溃。
接下来我尝试的是通过与 IP 地址相关的全局变量访问用户 session 。也不起作用,导致所有帐户都在同一 ip 上收到消息(我在所有 3 个浏览器的本地主机上进行测试)。
我最后尝试的是第一种方法。我在打开事件上设置了 2 秒的超时,然后发送了帐户消息。我终于能够在数据库中存储一个对等体!但是,令我懊恼的是,当我检查数据库时,它说(“资源 ID#6”)。我尝试将 $clients 数组转换为全局变量,但每次都是空的。我在谷歌上搜索了一下,然后我尝试序列化数组。这一切一直工作到我将消息发送给唯一对等方为止。
这里是发送消息的函数
function send_message_single_client($msg,$client)
{
@socket_write($client,$msg,strlen($msg));
return true;
}
这是我使用此功能将最后 100 条消息推送到新同伴的聊天框的示例。
if (in_array($socket, $changed)) {
$socket_new = socket_accept($socket);
$clients[] = $socket_new;
$header = socket_read($socket_new, 1024);
perform_handshaking($header, $socket_new, $host, $port);
socket_getpeername($socket_new, $ip);
$found_socket = array_search($socket, $changed);
//need to push last 100 messages to new peer.
$query = $mysqli->query("SELECT * FROM (SELECT * FROM uc_chat_msg WHERE `hidden`='0' ORDER BY `id` DESC LIMIT 100) as last100 ORDER BY id");
while($row = $query->fetch_assoc()) {
$response_text = mask(json_encode(array('type'=>'usermsg', 'name'=>security($row["username"]), 'message'=>security($row["message"]), 'color'=>security($row["color"]))));
send_message_single_client($response_text, $socket_new);//send old messages to the new client
}
$query->close();
unset($changed[$found_socket]);
}
那是几周前的事了,我把这个项目搁置一旁,这样我就可以继续前进并专注于其他事情。从那以后,我已经转向开发 vps 以适应应用程序不断增长的规模/复杂性。而不是 php,我使用的是 facebooks HHVM,不相关但我想我会提到它,因为它有一些怪癖迫使我稍微改变我的代码。
最佳答案
我不了解 PHP,但我认为这更像是一个方法问题,而不是编码问题。因此,我希望从我的推送架构经验中得出的这些想法能带来一些启示。
WebSockets 使用 HTTP 握手来发送该来源的 cookie。您可以将一个临时 ID(例如:GUID)附加到一个特殊的 session cookie,每次用户在同一 session 中重新连接时都会重新发送该 cookie。只要您遵守同源政策,您就可以从网站或在 HTTP 握手响应本身中部署 cookie。
当 WebSocket 连接时,您可以从服务器发送一 strip 有包含临时 ID 的 token 的初始消息。如果连接断开,可以在重新连接时重新发送该 token ,但如果用户重新加载页面,它将被遗忘,除非它保存在本地存储或任何其他类型的浏览器存储中。
临时 ID 如何映射到特定用户或帐户,是您不希望泄露到网络的实现细节。所以不要使用该信息来识别您的 WS 连接。
您应该保留一个“ session ”注册表,将临时 ID 映射到帐户,可能从内存中的字典映射到数据库中的表。由您决定,您的要求和服务。此元素必须保留对 WebSocket 连接的引用,以便您可以在需要时通过临时 ID 检索它。
切勿泄露内部详细信息,特别是帐户 ID(因为它们不会更改)。
从 WebSocket 接收消息时,您必须创建一个消息对象,其中包含使用您保留的“ session ”信息的发件人帐户以及实际的消息内容。然后,将此消息对象传递给将决定要做什么的业务逻辑。
为了发送消息,您必须首先定义几个元素:
哪些帐户在线?将您的“ session ”存储与帐户表合并。当连接断开时,您应该删除断开的用户 session 。
哪些账户属于特定的组或信号?您必须根据您的要求进行设计。一些组可以预定义并在“帐户”实体中指示,其他一些可能是动态的,例如他属于聊天室。无论如何,您需要另一个将“组”映射到“帐户”的元素
当您的业务逻辑决定要发送一条消息时,无论是作为对传入消息的响应、作为定时操作、主动性还是其他……它必须决定必须发送到哪个用户帐户、用户帐户或用户组已发送。
然后,使用您保留的 session 信息,收集必须接收该消息的临时 ID 列表,然后是该消息必须转发到的 WebSockets 列表,最后将消息发送到该消息的每个 WS列表。
关于php - Websockets,并识别独特的同行[PHP],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23101377/
导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri
之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶
Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在
在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc
如果我们有一个数组array=[1,1,0,0,2,3,0,0,0,3,3,3]我们如何识别给定数字的运行(具有相同值的连续数字的数量)?例如:run_pattern_for(array,0)->2run_pattern_for(array,3)->1run_pattern_for(array,1)->1run_pattern_for(array,2)->0没有2的运行,因为没有连续出现2。3有一个运行,因为只有一个幻影以树为连续数字。 最佳答案 尝试:classArraydefcount_runs(element)chunk{|n
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它
当尝试创建一个heroku应用程序并通过git推送到它时,我收到以下错误:$herokucreate'"C:\ProgramFiles\ruby-1.9.2\bin\ruby.exe"isnotrecognizedasaninternalorexternalcommand,operableprogramorbatchfile.但是,$ruby-vruby1.9.3p125[i386-mingw32]我已经检查了PATH环境,它肯定包含“C:\ProgramFiles(x86)\ruby-1.9.2\bin”。同样有趣的是,当导航到该目录时,它实际上并不包含名为ruby.exe的文件
本文章承接《基于Python的人脸识别课堂考勤系统(毕设)》,填坑上篇文章遗留的代码部分。因为项目分的模块比较多,再加上本人能力有限,所以代码过于臃肿还存在许多优化的地方。同样本篇文章也仅适用于小白,零基础人群。PS:每个文件之中代码都已经区分开来,可以对照左侧目录部分实现快速预览! 由于代码过于多我这里分成上,下两个部分来发布吧!一、主文件importosimportsysimportrandomimportpymysqlimportcv2importnumpyasnpfrommathimportpifrommatplotlibimportpyplotaspltfromPILimpor
目录1古彝文与古典保护2古文识别的挑战2.1西文与汉文OCR2.2古彝文识别难点3合合信息:古彝文保护新思路3.1图像矫正3.2图像增强3.3语义理解3.4工程技巧4总结1古彝文与古典保护彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意义上的彝文,古彝文指的是在民间流通使用的原生态彝文,多达87046字。古彝文的起源距今至少数千年,是世界上最古老的文字之一。对古彝文字集研究有助于理解尚未被翻译成汉文、用字尚未规范化的古籍,更深层、透彻地作用于传统文化保护。古彝文字义对照图(网络资料+邵文苑供图)古籍是不可再生的宝贵资源,应当得到妥善保护。中国的古籍在历史上迭经水火兵燹等自然灾害、