使用 MySql 和 Websocket 协议在 Perl 中创建一个小时
Posted
技术标签:
【中文标题】使用 MySql 和 Websocket 协议在 Perl 中创建一个小时【英文标题】:Creating an hour in Perl using MySql and the Websocket protocol 【发布时间】:2020-08-31 03:12:26 【问题描述】:下午好,我正在使用 mysql 和 Websocket 协议在 Perl 中编写聊天。 我正在使用 AnyEvent 模块和协议 :: WebSocket。
我知道为此使用 Mojo 或 Node.js 会更好,但在我的情况下,它需要这样。
我从 Websocket 接收数据,反向连接。在输入字段中输入的数据也适合数据库。 我的问题是我现在如何将这些数据实时输出到 Web 界面。
#!/usr/bin/env perl
use strict;
use warnings;
use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::DBI::MySQL;
use AnyEvent::Socket;
use Protocol::WebSocket::Handshake::Server;
use Protocol::WebSocket::Frame;
my $dbh = AnyEvent::DBI::MySQL->connect("DBI:mysql:chat:localhost", "admin", "admin",
mysql_enable_utf8 => 1,
PrintError => 0,
) or die;
my $cv = AnyEvent->condvar;
my $hdl;
my $sth;
AnyEvent::Socket::tcp_server undef, 3000, sub
my ($clsock, $host, $port) = @_;
my $hs = Protocol::WebSocket::Handshake::Server->new;
my $frame = Protocol::WebSocket::Frame->new;
$hdl = AnyEvent::Handle->new(fh => $clsock);
$hdl->on_read(
sub
my $hdl = shift;
my $chunk = $hdl->rbuf;
$hdl->rbuf = undef;
if (!$hs->is_done)
$hs->parse($chunk);
if ($hs->is_done)
$hdl->push_write($hs->to_string);
return;
$frame->append($chunk);
my $message = $frame->next;
if ($message eq "")
$message = undef;
else
$sth = $dbh->do("INSERT INTO web_chat VALUES('$message')", async => 0 );
my $ary_ref = $dbh->selectcol_arrayref("SELECT text FROM web_chat");
);
;
$cv->wait;
1;
客户端不是用 javascript 编写的
<!doctype html>
<form name="publish">
<input type="text" name="message" maxlength="50"/>
<input type="submit" value="Send"/>
</form>
<div id="messages"></div>
<script>
let socket = new WebSocket('ws://192.168.1.1:3000/websocket/');
// отправка сообщения из формы
document.forms.publish.onsubmit = function()
let outgoingMessage = this.message.value;
socket.send(outgoingMessage);
return false;
;
socket.onopen = function ()
console.log("Websocket Connection");
;
socket.onerror = function ()
console.log("Error websocket connection ");
// прослушка входящих сообщений
socket.onmessage = function(event)
let incomingMessage = event.data;
showMessage(incomingMessage);
;
socket.onclose = event => console.log(`Closed $event.code`);
// отображение информации в div#messages
function showMessage(message)
let messageElem = document.createElement('div');
messageElem.textContent = message;
document.getElementById('messages').prepend(messageElem);
</script>
【问题讨论】:
您应该使用 DBI 占位符。您的代码容易受到 SQL 注入的攻击。 我用谷歌搜索了这个文档,metacpan.org/pod/Net::WebSocket::Server 【参考方案1】:我可以为此推荐 Mojolicious 和 Mojo::Mysql 吗?
Protocol::WebSocket 非常“简单”,不处理很多协议细节,如 ping/pong。
【讨论】:
以上是关于使用 MySql 和 Websocket 协议在 Perl 中创建一个小时的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TLS/SSL 确保 WebSocket 连接的安全