Javascript 如何使用Websockets实现Socket.io聊天应用程序并从数据库(mysqli)获取用户名

Javascript 如何使用Websockets实现Socket.io聊天应用程序并从数据库(mysqli)获取用户名,javascript,php,node.js,mysqli,socket.io,Javascript,Php,Node.js,Mysqli,Socket.io,我正在寻找一种实现聊天功能的方法 我正在为残疾人建立一个约会/友谊网站,进展非常顺利 由于我是一名编程新手,我一直在寻找一种方法来创建一个简单的聊天功能(理想情况下,该功能只在双方都喜欢或感兴趣时才起作用),因此我在youtube上找到了一个-[,它非常完美,无需重新加载页面等 当在Localhost:3000上打开它时,它就像一个符咒,但是我尝试在我的网站上实现它,它显示,但不起作用,这个聊天也有一个登录功能,但是当客户端在我的网站上时,他们已经登录了。我想知道如何获取我的用户数据,然后使用它

我正在寻找一种实现聊天功能的方法

我正在为残疾人建立一个约会/友谊网站,进展非常顺利

由于我是一名编程新手,我一直在寻找一种方法来创建一个简单的聊天功能(理想情况下,该功能只在双方都喜欢或感兴趣时才起作用),因此我在youtube上找到了一个-[,它非常完美,无需重新加载页面等

当在Localhost:3000上打开它时,它就像一个符咒,但是我尝试在我的网站上实现它,它显示,但不起作用,这个聊天也有一个登录功能,但是当客户端在我的网站上时,他们已经登录了。我想知道如何获取我的用户数据,然后使用它进行聊天

php文件

     <!DOCTYPE html>
      <html>
   <head>
  <title>chat</title>




      <link rel = "stylesheet" 
      href="https://maxcdn.bootstrapcdn.com/bootstrap/
     3.3.6/css/bootstrap.min.css">
 <script src="https://code.jquery.com/jquery-latest.min.js"></script>
 <script src="/socket.io/socket.io.js"></script>
  <style >
  body{ margin-top: 5em;
       }

  </style>
  </head>
   <body>
<div class = "container">

 <div id = "userFormArea" class= "row">
 <div class = "col-md-12">
  <form id = "userForm">
   <div class = "form-group">
    <label>Enter Username</label>
    <input class = "form-control" id = "username">
    <br/>
    <input type="submit" class = "btn btn-primary" value = " Login"/>
   </div>
   </form>

 </div>
 </div>
 <div class = "row" id = "messageArea">
<div class = "col-md-4">
 <div class = "well">
   <h3> Online users </h3>
  <ul class = "list-group" id = "users"> </ul>

  </div>

</div>
<div class = "col-md-8">
<div class="chat" id = "chat"> </div>

 <form id = "messageForm">
  <div class = "form-group">
  <label>Enter Message</label>
  <textarea class = "form-control" id = "message"> </textarea>
  <br/>
   <input type="submit" class = "btn btn-primary" value = "Send Message"/>
  </div>
   </form>
   </div>

 </div>

 </div>
 <script>
   $(function(){
  var socket = io.connect();
 var $messageForm = $('#messageForm');
 var $message = $('#message');
 var $chat = $('#chat');
  var $userFormArea = $('#userFormArea');
  var $userForm = $('#userForm');
  var $messageArea = $('#messageArea');
    var $users = $('#users');
  var $username = $('#username');

  $messageForm.submit(function(e){
   e.preventDefault();
   socket.emit('send message', $message.val());
   $message.val('');
  });

  socket.on('new message', function(data){
     $chat.append('<div class = "well"><strong>'+data.user+'</strong>:' + 
  data.msg + '<div>');
   });

  $userForm.submit(function(e){
   e.preventDefault();
    socket.emit('new user', $username.val(),function(data){
    if(data){
    $userFormArea.hide();
     $messageArea.show();
    }
    });
   $username.val('');
  });
  socket.on('get users', function(data){
  var html = '';
  for (i = 0; i< data.length; i++){
    html +='<li class = "list-group-item" >' + data[i]+ '</li>';
    }
     $users.html(html);
   });
  });
 </script>

请原谅这篇长篇文章,我将继续在互联网上寻找答案,因此也许我可以让这个问题更具体。提前谢谢。

我将向您展示它非常相似的地方

首先,此作业需要一些额外的模块:

    var CONFIG = require('./config');
    var dl  =            require('delivery');
    var fs  =            require("fs");
    var mysql =          require('mysql');
    var express =    require("express");
    var app =            express();
    var http =           require('http');
    var https =      require('https');
    var mkdirp =       require('mkdirp');
    var nodemailer = require('nodemailer');
    function include(f) {eval.apply(global, [read(f)]);}
    function read(f) {return fs.readFileSync(f).toString();}
从npm安装定义中的所有模块

var REG_PATH = CONFIG.PATH_OF_WWW + CONFIG.REG_PATH; 

include('lib/preinit.js');

var DATABASE = require('./account/account');

DATABASE.fs = fs;
DATABASE.handleDisconnect();
DATABASE.GET_ALL_USERS();

// NO SECURE - HTTP 

var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(CONFIG.ACCOUNT_PORT);
console.log('Socket server listening on port : ' , CONFIG.ACCOUNT_PORT);
套接字作业是下一个作业,但您可以在此上找到完整的文件

我将显示您的小型定制模块(需要('./帐户/帐户)):

重要信息:不要错过此功能:“this.connection.on('error')”

module.exports={
名称:“账户系统”,
//电子邮件系统配置
smtpTransport:require('nodeEmailer').createTransport(“SMTP”{
主机:“smtp.gmail.com”//hostname
安全连接:false,
端口:587,//用于安全SMTP的端口
是的,
域名:[“gmail.com”、“googlemail.com”],
tls:{密码:'SSLv3'},
认证:{
用户:“eroulete@gmail.com",
通过:“###”
}
}),
财政司司长:'',
createEmailVerifyFile:函数(路径、脚本、内部){
//fs.writeFile(“../www/html/users/”+path,“Cool…”+script\u inner+”,函数(err){
此.fs.writeFile(路径“酷…”+脚本内部+”,函数(err){
如果(错误){
返回console.log(err);
}否则
{
log(“文件已保存!”);
}
});  
},
发送电子邮件:功能(子、收件人、普通){
此文件为.smtpTransport.sendMail({
发件人:“Maximumroulette.com”,//发件人地址
收件人:“新用户”//以逗号分隔的接收者列表
主题:子主题,//主题行
html:纯//纯文本正文
},函数(错误,响应){
如果(错误){
console.log(“发送电子邮件时出错”,错误);
}否则{
console.log(“发送的消息:+response.Message”);
}
});
},
//数据库
连接:需要('mysql')。createConnection({
主机:“localhost”,
用户:'根',
密码:“nikola”,
数据库:“测试”
}), 
handleDisconnect:function(){
this.connection=require('mysql').createConnection({
主机:“localhost”,
用户:'根',
密码:“nikola”,
数据库:“测试”
}); 
this.connection.connect(函数(err){
如果(!err){
console.log(“Init...\n”);
日志(“数据库已连接…\n”);
}否则{
日志(“连接数据库时出错…\n”,错误);
}
});
/////////////////////////////////////////////////////////////////////////
this.connection.on('error',函数(err){
console.log('db error',err);
如果(err.code==='PROTOCOL\u CONNECTION\u LOST'){//到MySQL服务器的连接通常是
setTimeout(function(){this.handleDisconnect();},500);//由于服务器重新启动或
}否则{
//连接空闲超时(等待超时
log('db error BIG',err);
this.connection.end();
setTimeout(function(){this.handleDisconnect();},500);//由于服务器重新启动或
//抛出错误;//服务器变量配置此错误)
}
});
},
获取所有用户:函数(){
this.connection.query('SELECT*from accounts',函数(err、行、字段){
如果(!err){
log('获取所有用户:',行);
ACCOUNTS.LIST=[];
账户。插入(行);
}
其他的
{
log('执行查询时出错');
}
});
},
//新帐户
//var NEW_ACCOUNT_POST={密码:“nidza”,电子邮件:zlatnaspirala@gmail.com,token:token()};
添加新帐户:功能(post){
var query=this.connection.query('INSERT INTO accounts SET?',post,函数(err,result){});
log(query.sql);
},
//添加新账户(新账户帖子);
激活账户:功能(post){
this.connection.query('updateaccounts SET active=?WHERE token=?',[post.active,post.token],函数(err,result){
如果(!err){
控制台日志(“激活帐户”);
}
});
},
设置新昵称:功能(帖子、电子邮件){
var query=this.connection.query('UPDATE accounts SET昵称=?WHERE email=?',[post,email],函数(err,result){
如果(!err){
log(“添加新昵称evenk OK”);
}
否则{
log(“添加新昵称事件错误”);
}
});
},
//会议
设置会话:功能(post){
this.connection.query('updateaccountsetonline=?WHERE-token=?',[“yes”,post],函数(err,result){
控制台日志(post);
如果(!err){
log(“setup session OK online=yes for token”,token);
}
否则{
日志(“安装会话中的错误”);
}
});
},  
关闭会话:功能(post,ID){
this.connection.query('updateaccountsetonline=?WHERE-token=?',[“no”,post]);
this.connection.query('DELETE FROM level1 WHERE email=?',[ID],
函数(错误、结果){
如果(!err){
console.log(“从1级活动游戏中删除的玩家”);
}否则{
console.log(“在1级错误中从活动游戏中删除的玩家”);
}
});
//log(query.sql);
},
//新房间
//var ADD_ROOM_POST={id:“0”,game:“level1 ROOM”,accesstoken:token(),下注:0.1,最大下注:50};
//添加新的房间(添加房间和帖子);
新增房间:功能(post){
var query=this.connection
var REG_PATH = CONFIG.PATH_OF_WWW + CONFIG.REG_PATH; 

include('lib/preinit.js');

var DATABASE = require('./account/account');

DATABASE.fs = fs;
DATABASE.handleDisconnect();
DATABASE.GET_ALL_USERS();

// NO SECURE - HTTP 

var server = http.createServer(app);
var io = require('socket.io').listen(server);
server.listen(CONFIG.ACCOUNT_PORT);
console.log('Socket server listening on port : ' , CONFIG.ACCOUNT_PORT);
module.exports = {

NAME : 'account_system',

// EMAIL SYSTEM CONFIG
smtpTransport : require('nodemailer').createTransport("SMTP",{
host: "smtp.gmail.com", // hostname
secureConnection: false,
port: 587, // port for secure SMTP
requiresAuth: true,
domains: ["gmail.com", "googlemail.com"],
tls: {ciphers:'SSLv3'},
auth: {
user: "eroulete@gmail.com",
pass: "###"
}
}),

fs : '',

createEmailVerifyFile : function(path_ , script_inner){
    //fs.writeFile( "../www/html/users/" + path_ , "<html><head><script src='../../js/socket.io.js'></script><script src='https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js'></script></head><body> <h1> Cool... </h1><script>"+script_inner+"</script> </head></body>", function(err) {
    this.fs.writeFile(  path_ , "<html><head><script src='../../lib/io/socket.io.js'></script><script src='https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js'></script></head><body> <h1> Cool... </h1><script>"+script_inner+"</script> </head></body>", function(err) {

    if(err) {
        return console.log(err);
    }else
    {
    console.log("The file was saved!");
    }
});  

},

SEND_EMAIL : function( sub_ , to , plain ) {

this.smtpTransport.sendMail({
   from: "Maximumroulette.com <eroulete@gmail.com>", // sender address
   to: "New user <"+to+">", // comma separated list of receivers
   subject: sub_, // Subject line
   html: plain // plaintext body
}, function(error, response){
   if(error){
       console.log("error in sending email" , error);
   }else{
       console.log("Message sent : " + response.message);
   }
});

},


//Database 
connection : require('mysql').createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'nikola',
  database : 'test'
}), 

handleDisconnect : function(){

  this.connection = require('mysql').createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'nikola',
  database : 'test'
}); 
    this.connection.connect(function(err){

if(!err) {

    console.log("Init..................... \n");  
    console.log("Database is connected ... \n");

} else {
    console.log("Error connecting database... \n" , err);  
}
});
    /////////////////////////////////////////////////////////////////////////

    this.connection.on('error', function(err) {
    console.log('db error', err);
    if(err.code === 'PROTOCOL_CONNECTION_LOST') { // Connection to the MySQL server is usually
     setTimeout(function(){ this.handleDisconnect();    },500);                     // lost due to either server restart, or a
    } else { 
    // connnection idle timeout (the wait_timeout
    console.log('db error BIG', err);
    this.connection.end();
    setTimeout(function(){ this.handleDisconnect();    },500);                     // lost due to either server restart, or a

   //  throw err;                                  // server variable configures this)
    }
  });


},


GET_ALL_USERS : function(){

this.connection.query('SELECT * from accounts', function(err, rows, fields) {
  if (!err){
    console.log(' GET ALL USERS : ', rows);
    ACCOUNTS.LIST = [];
    ACCOUNTS.INSERT(rows);

    }
  else
  {
    console.log('Error while performing Query.');
  }
});

},

// New account
//var NEW_ACCOUNT_POST = {   password: "nidza" , email:"zlatnaspirala@gmail.com" ,  token : token() };


ADD_NEW_ACCOUNT : function(post) {
var query = this.connection.query('INSERT INTO accounts SET ?', post, function (err, result) {});
console.log(query.sql);
},
//ADD_NEW_ACCOUNT(NEW_ACCOUNT_POST);


ACTIVATE_ACCOUNT : function(post) {

this.connection.query('UPDATE accounts SET active = ? WHERE token = ?', [post.active , post.token ]  ,  function (err, result) {

if (!err) {

console.log("ACTIVATE ACCOUNT");

}

});

},


SET_NEW_NICKNAME : function(post, email) {
var query = this.connection.query('UPDATE accounts SET nickname=? WHERE email=?', [post, email] , function (err, result) {
 if (!err){
 console.log("add new nickname evenk OK"); 
 }
 else {
 console.log("add new nickname event ERROR "); 
 }

});
},

//Session 
SETUP_SESSION : function(post) {
this.connection.query('UPDATE accounts SET online = ? WHERE token = ?', [ "yes" , post ] , function (err, result) {
console.log(post);
if (!err) {
console.log("setup session OK online = yes for token " , token);
}
else {
console.log("error in setup session");
}
});
},  

CLOSE_SESSION : function(post , ID) {

this.connection.query('UPDATE accounts SET online = ? WHERE token = ?', [ "no" , post ] );
this.connection.query('DELETE FROM level1 WHERE email = ?', [ ID ] , 
 function(err , result){
 if (!err) {

 console.log("player deleted from active games in level1 ");

 }else{

 console.log("player deleted from active games in level1 ERROR IN ");

 }

 });
//console.log(query.sql);
},

// New room
//var ADD_ROOM_POST = {   id : "0" , game:"level1 room " ,  accesstoken : token() , wager : 0.1 , maxbet : 50  };
//ADD_NEW_ROOM(ADD_ROOM_POST);

ADD_NEW_ROOM : function(post) {
var query = this.connection.query('INSERT INTO rooms SET ?', post, function (err, result) {
 if (!err){

 console.log("add new room evenk OK"); 

 }
 else {

 console.log("add new room evenk ERROR : Maybe room already exist."); 

 }


});
},


LOAD_ROOMS : function(post) {
var query = this.connection.query('SELECT * FROM rooms', function (err, rows, fields) {

  if (!err){

    console.log('ROOM  list : ', rows);
    ROOMS.INSERT(rows);

    }
  else
  {
    console.log('Error while performing Query : load rooms' , err);
  }

});

},

};