javascript - 使用 MySql 和 Websocket 协议(protocol)在 Perl 中创建一个小时

标签 javascript mysql perl websocket

下午好,我正在使用 Mysql 和 Websocket 协议(protocol)在 Perl 中编写聊天。 我正在使用 AnyEvent 模块和 Protocol::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>

最佳答案

我可以为此推荐 Mojolicious 和 Mojo::Mysql 吗?

Protocol::WebSocket 非常“简单”,不会处理很多协议(protocol)细节,例如 ping/pong。

关于javascript - 使用 MySql 和 Websocket 协议(protocol)在 Perl 中创建一个小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61799831/

相关文章:

javascript - Chrome 扩展 - 注入(inject)的 Iframe 不访问 Chrome browserAction 或 chrome.tabs 或 AngularJS

javascript - 使用文档片段渲染 Backbone View 会中断事件处理

php - MYSQL/SQL如何查询这个表结构中的订单结果?

php - Yii2 在 sql 中插入日期和时间

perl - 在 Perl 中,您如何动态选择要用作回调的方法?

perl - 如何通过管道使用 Parallel::ForkManager?

perl - Perl 如何验证一个路径是一个目录,但又不能同时调用 opendir() 呢?

javascript - 如何在 Javascript 的 if 语句中检查变量中的数字和运算符

javascript - 如何在 angular js ui Grid 中删除 pdf 导出中的某些列

javascript - 单击按钮将 MySQL 数据加载到文本框中