Как наладить связь между 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"});
}
})
});
Код сокета - солянка из того, что я нашел на просторах интернета, по некоторым механизмам имею слабое представление о их работе и функционале.