Как наладить связь между socket.io и сервером?

Пролог:

Пишу сайт исключительно на PHP, но для реализации чата почему-то решил использовать socket.io (JAVA). Возможно, более правильно, было бы использовать сокеты PHP, но, думаю, мне же в плюс, больше опыта будет.


Основная часть:

Итак, все сессионные данные хранятся в сессии PHP. Дабы установить у какого пользователя с кем начаты чаты - предполагаю использовать session_id(). Следовательно этот куки надо передать в сокет.


Моя текущая структура:

Есть страница с авторизацией, после которой пользователю присваивается session_id() и перенаправляют в личный кабинет.

<?php
date_default_timezone_set('Europe/Moscow');
ini_set("max_execution_time", "9000000");
ini_set('memory_limit', '5256M');
//include_once '../../php/NewConnect.php';

if(session_id() == ''){
    session_start();
}

$_SESSION['session_id'] = session_id();

if($_COOKIE) {
    if (isset($_COOKIE['user_id'])) {
        $_SESSION['user_id'] = $_COOKIE['user_id'];
    }else{
        if(!isset($_SESSION['user_id'])){
            $_SESSION['user_id'] = '';
        }
    }
}else{
    if($_SESSION) {
        if (!$_SESSION['user_id']) {
            $_SESSION['user_id'] = '';
        }
    }else{
        $_SESSION['user_id'] = '';
    }
}

$_SESSION['user_id'] = rand(1,99);

?>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <!-- Подключение Bootstrap чтобы все выглядело красиво -->
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css">
    <title>Чат программа</title>
    <!-- Свои стили -->
    <style>
        body {
            background: #fcfcfc;
        }
    </style>
</head>
<body>
<!-- Создание меню на сайте (без функций) -->
<div class="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm">
    <h5 class="my-0 mr-md-auto">Desavir</h5>
    <nav class="my-2 my-md-0 mr-md-3">
        <a class="p-2 text-dark" href="#">Главная</a>
        <a class="p-2 text-dark" href="#">Про нас</a>
        <a class="p-2 text-dark" href="#">Поддержка</a>
        <a class="p-2 text-dark" href="#">Цены</a>
    </nav>
    <a class="btn btn-outline-primary" href="#">Регистрация</a>
</div>
<!-- Основная часть страницы -->
<div class="container">
    <div class="py-5 text-center">
        <h2>Чат программа</h2>
        <p class="lead">Укажите ваше имя и начинайте переписку</p>
    </div>
    <div class="row">
        <div class="col-6">
            <!-- Форма для получения сообщений и имени -->
            <h3>Форма сообщений</h3>
            <form id="messForm">
                <label for="name">Имя</label>
                <input type="text" name="name" id="name" placeholder="Введите имя" class="form-control">
                <br>
                <label for="message">Сообщение</label>
                <textarea name="message" id="message" class="form-control" placeholder="Введите сообщение"></textarea>
                <br>
                <input type="submit" value="Отправить" class="btn btn-danger">
            </form>
        </div>
        <div class="col-6">
            <h3>Сообщения</h3>
            <!-- Вывод всех сообщений будет здесь -->
            <div id="all_mess"></div>
        </div>
    </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
    $(function() {
        /*let socketName = $('#NameID').val();
        $('#NameID').remove();*/
        let socketName = localStorage.getItem('socketName');
        if(socketName==null) {
            socketName = Math.ceil(Math.random() * (99 - 1) + 1);
            localStorage.setItem('socketName', socketName);
        }
        console.log(socketName);
        var socket = io.connect();
        socket.emit('NameF',{nameID:socketName});
        var $form = $('#messForm');
        var $name = $('#name');
        var $mes = $('#message');
        var $all_mes = $('#all_mess');

        $form.submit(function (event) {
            event.preventDefault();
            socket.emit('sendMess', {name:$name.val(),mes:$mes.val(),nameID:socketName});
            $mes.val('');
        });

        socket.on('add mes', function (data) {
            $all_mes.append("<div>" + data.name+"::"+data.id+": "+data.message + "</div>");
        });

        socket.on('error',function (data) {
            $all_mes.append("<div>" + data.message + "</div>");
        });
    });
</script>
</body>

На данный момент Websoket запускается, через терминал, мне же надо, что бы он запускался после загрузки страницы( Если я не прав - поправьте ).


Вот код сокета

var express = require('express');
var app = express();
var cookieParser = require('cookie-parser');
var phpExpress = require('php-express')({
    // assumes php is in your PATH
    binPath: 'D:\\Наука\\public_html\\chat\\PHPconfig\\php.exe'
});

// set view engine to php-express
app.set('views', './phpVideo');
app.engine('php', phpExpress.engine);
app.set('view engine', 'php');

// routing all .php file to php-express
app.all(/.+\.php$/, phpExpress.router);
app.all('/', phpExpress.router);

app.use(cookieParser());
app.get('/', function (req, res) {
    // Cookies that have not been signed
    console.log('Cookies: ', req.cookies)

    // Cookies that have been signed
    console.log('Signed Cookies: ', req.signedCookies)
})

var server = app.listen(3000, function () {
    var host = "localhost"//server.address().address;
    var port = server.address().port;
    console.log('PHPExpress app listening at http://%s:%s', host, port);
});
var io = require('socket.io').listen(server);
//var server = require('http').createServer(app);

//server.listen(3000);

users = [];
connections = [];

io.set('authorization', function (handshakeData, accept) {
    console.log(handshakeData.headers);
});

io.sockets.on('connection',function (socket) {
    connections.push(socket);
    //console.log(socket.id);

    socket.on('disconnect',function (data) {
        connections.splice(connections.indexOf(socket),1);
        console.log('Off');
    })

    socket.on('NameF',function (data) {
        users.push(data.nameID);
        console.log(data.nameID);
    })

    socket.on('sendMess', function (data) {
        if(data.mes&&data.id&&data.nameID) {
            io.sockets.connected[users.indexOf(data.nameID)].emit('add mes', {message: data.mes, id: data.id, name: data.nameID});
        }else{
            io.sockets.connected[users[data.nameID]].emit('error', {message: "Error1001: Not found data"});
        }
    })
});

Код сокета - солянка из того, что я нашел на просторах интернета, по некоторым механизмам имею слабое представление о их работе и функционале.


Ответы (0 шт):