Javascript 使用MySql和Websocket协议在Perl中创建一小时
下午好,我正在使用Mysql和Websocket协议用Perl编写聊天。 我使用的是AnyEvent模块和Protocol::WebSocket 我知道最好使用Mojo或Node.js来实现这一点,但在我的情况下,需要这样做 我从Websocket接收数据,反转并连接。输入字段中输入的数据也适用于数据库。 我的问题是,现在如何将这些数据实时输出到web界面Javascript 使用MySql和Websocket协议在Perl中创建一小时,javascript,mysql,perl,websocket,Javascript,Mysql,Perl,Websocket,下午好,我正在使用Mysql和Websocket协议用Perl编写聊天。 我使用的是AnyEvent模块和Protocol::WebSocket 我知道最好使用Mojo或Node.js来实现这一点,但在我的情况下,需要这样做 我从Websocket接收数据,反转并连接。输入字段中输入的数据也适用于数据库。 我的问题是,现在如何将这些数据实时输出到web界面 #!/usr/bin/env perl use strict; use warnings; use AnyEvent; use Any
#!/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>
let socket=new-WebSocket('ws://192.168.1.1:3000/WebSocket/');
// отправка сообщения из формы
document.forms.publish.onsubmit=函数(){
让outgoingMessage=this.message.value;
socket.send(outgoingMessage);
返回false;
};
socket.onopen=函数(){
日志(“Websocket连接”);
};
socket.onerror=函数(){
日志(“错误websocket连接”);
}
// прослушка входящих сообщений
socket.onmessage=函数(事件){
让incomingMessage=event.data;
showMessage(incomingMessage);
};
socket.onclose=event=>console.log(`Closed${event.code}`);
//信息
函数showMessage(消息){
让messageElem=document.createElement('div');
messageElem.textContent=消息;
document.getElementById('messages').prepend(messageElem);
}
我可以推荐Mojolicious和Mojo::Mysql吗
协议::WebSocket非常“简单”,不能处理很多协议细节,比如乒乓球。您应该使用DBI占位符。您的代码易受SQL注入攻击。我在谷歌上搜索了此文档,