【问题标题】:How to implement a Socket.io Chat App Using Websockets and Fetch usernames from database (mysqli)如何使用 Websockets 实现 Socket.io 聊天应用程序并从数据库中获取用户名 (mysqli)
【发布时间】:2024-05-23 23:00:02
【问题描述】:

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

我正在为残障人士建立一个约会/友谊网站,进展顺利。

由于我是编程领域的初学者,我一直在寻找一种方法来创建一个简单的聊天功能(理想情况下,只有在相互喜欢或感兴趣时才起作用),所以我在 youtube 上找到了一个-[ https://www.youtube.com/watch?v=tHbCkikFfDE] ,完美,无需重新加载页面等。

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

chat.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>

server.js 文件

var express =require('express'),
  http = require('http');
 var app= express();
 var server = require('http').createServer(app);
 var io = require('socket.io').listen(server);

 users = [];
 connections = [];

  server.listen(process.env.Port || 3000);
  console.log('server running ...')

 app.get('/', function(req, res) {
  res.sendFile(__dirname + '/chat.php');
  });

 io.sockets.on('connection', function(socket){
   connections.push(socket);
  console.log('Connected: %s sockets connected', connections.length);

   socket.on('disconnect',function(data){
   users.splice(users.indexOf(socket.username),1);
   updateUsernames();
  connections.splice(connections.indexOf(socket),1);
   console.log('Disconnected: %s sockets conected', connections.length);
  } );
  //send message
  socket.on('send message', function(data){
   console.log(data)
   io.sockets.emit('new message',{msg: data, user: socket.username});
    });

  //new User

   socket.on('new user', function(data,callback){
   callback(true);
   socket.username = data;
   users.push(socket.username);
    updateUsernames();
    });

     function updateUsernames(){
     io.sockets.emit('get users', users)
    }
    });

对不起,这篇文章很长,我会继续在互联网上寻找答案,所以也许我可以把这个问题说得更具体一些。提前致谢。

【问题讨论】:

    标签: javascript php node.js mysqli socket.io


    【解决方案1】:

    我将向您展示 mysql 变体,它非常相似。

    首先你需要一些额外的模块来完成这项工作:

        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);
    

    接下来是套接字作业,但您可以在此 address 上找到完整的文件。

    我会展示你的小自定义模块(require('./account/account')):

    重要提示:不要错过这个功能:“this.connection.on('error' ...”

    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);
      }
    
    });
    
    },
    
    }; 
    

    【讨论】: