Ik heb op samentypen.nl een soort chatbox: 1 inputveld voor de invoer waarin leerlingen hun antwoord/tekst typen.
De andere leerlingen (en de leerkracht) zien deze tekst ook verschijnen.

Momenteel wordt dit invoerveldt nu om de seconde opgeslagen (dmv JSON via AJAX (met jQuery)) in de (InnoDB-)database.
Met dezelfde request haal ik ook op wat andere mensen (leerlingen) hebben getypt.
Dus 1 per seconde.

Gisteren waren we met 3 klassen tegelijkertijd bezig op onze school: 80 leerlingen + 3 leerkrachten die 1x per seconde opslaan en ophalen.
Maar tegelijkertijd waren nog 8 andere klassen bezig: 400 requests per seconde.... dat is dus al 480 requests per seconde waarin er dus 1 config.php geincluded wordt, database-connectie wordt gemaakt, 1 UPDATE-statement is en 1 SELECT-statement.
En dat 480x per seconde, voor een kwartiertje lang.

Inmiddels zijn er al scholen 'geblokkeerd' wegens DDOS-lijkende-dingen.

Hoe voorkom ik dit?
Is het mogelijk om één continue-stroom (stream) open te zetten per leerling? Die alsnog alles per seconde (of liever per halve seconde) opslaat en ophaalt?
Maar dan zonder steeds een nieuwe verbinding te maken etc?

Wellicht kan dit niet. Wellicht wel.
Zo wel: op welke termen moet ik zoeken?
STREAM AJAX werd hem niet.
Een andere manier gebruiken, zoals een bericht enkel te pushen i.p.v te pollen.
Met NodeJS kan je dit prima doen.
Hier hebben ze Websockets voor uitgevonden. Even doorbijten, maar werkt dan vele malen soepeler dan constant staan te pollen ...
Thanks Rob.
Dit lijkt exact wat ik nodig heb.

Je moet maar net even op die term komen... Ik kan hier mee aan de slag voor nu!
Het is even later... maar inmiddels een hosting extra genomen waarop wel Node.JS draait:
samentypen.nl/socket/ geeft 503 aan, dus de websockets luisteren wel.
Via de DirectAdmin (maar dan een andere versie??) heb ik de package.json weten te installeren:

[img]https://i.ibb.co/thbG7SB/Screen-Shot.png[/img]

Hoe voer ik die 'console/command'-opdracht uit?
Ik heb een command.js aangemaakt:


source /home/samenty/nodevenv/socket/12/bin/activate && cd /home/samenty/socket


Deze staat in dezelfde map als package.json. Hoe open ik die?

Ik trachtte dit ook te doen in package.json zelf (want die kan ik 'runnen'):

const http = require('https');
const hostname = '127.0.0.1';
const port = 3000;
const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Ik kan <b>beginnen</b>.<br>');
}).listen(port);

server.listen(port, hostname, () => {
  console.log('Server running at http://${hostname}:${port}/');
});


Ik ben echt een leek, kan aardig de handleidingen toevoegen, maar de koppeling naar een database heb ik niet.. (heb ik dat nodig?).

Wie kan mij even op weg helpen?
Meekijken en inloggen kan ook, via Persoonlijk Bericht dan wel ;)

Helaas heb ik die shell-toegang niet.
Of kan dat via een php-file met exec()?
Ik ga dat eens proberen...

[size=xsmall]Toevoeging op 27/12/2019 09:34:46:[/size]

Ik heb node.js aan staan.
Als ik die tutorial volg en een bestand aanmaak (in dezelfde map als waar app.js is gemaakt door DirectAdmin) kan ik die benaderen via https://samentypen.nl/socket/domains/samentypen.nl/public_html/socket/index.js (ja dubbel op al dat gedoe met domain/... etc, maar dit werkt prima in submappen.
Zie de code daar die luistert naar poort 8080... maar dit bestand (index.js) wordt toch niet uitgevoegd?
Hoe doe ik dat?

[size=xsmall]Toevoeging op 27/12/2019 09:40:21:[/size]

En nog een aanvulling: ik kan dus wel NPM-code uitvoeren en JS-files uitvoeren, mist deze code in package.json staat.
Ik heb nu even 1 regel laten uitvoeren, namelijk const express = require('express'); om te testen.

Gehele code van package.json:
{
	"name": "samentypen_socket",
	"description": "De socket die gebruikt wordt bij SamenTypen.nl",
	"version": "12.9.0",
	"dependencies": {
		"express": "^4.15.2",
		   "socket.io-adapter": "~1.1.0",
    "socket.io-client": "2.3.0",
    "socket.io-parser": "~3.4.0"
	},
	"main": "app.js",
	"scripts": {
		"startcode": "const express = require('express');"
	},
	"keywords": [],
	"author": "Eddy Erkelens",
	"license": "ISC"
}


Hierdoor kan ik index.js (zie hieronder) uitvoeren.
Maar krijg foutmelding (daar weer onder)...

index.js

const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);

app.get('/', function(req, res) {
    res.send('Hello world!');
});

const server = http.listen(8080, function() {
    console.log('listening on *:8080');
});


Foutmeldingen
returncode: 1
stdout:
> [email protected] start /home/samenty/domains/samentypen.nl/public_html/socket
> node index.js
stderr:
npm WARN lifecycle The node binary used for scripts is /home/samenty/nodevenv/domains/samentypen.nl/public_html/socket/10/bin/node but npm is using /opt/alt/alt-nodejs10/root/usr/bin/node itself. Use the `--scripts-prepend-node-path` option to include the path for the node binary npm was executed with.
internal/modules/cjs/loader.js:638
throw err;
^

Error: Cannot find module 'socket.io'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:636:15)
at Function.Module._load (internal/modules/cjs/loader.js:562:25)
at Module.require (internal/modules/cjs/loader.js:692:17)
at require (internal/modules/cjs/helpers.js:25:18)
at Object.<anonymous> (/home/samenty/domains/samentypen.nl/public_html/socket/index.js:4:12)
at Module._compile (internal/modules/cjs/loader.js:778:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
at Module.load (internal/modules/cjs/loader.js:653:32)
at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
at Function.Module._load (internal/modules/cjs/loader.js:585:3)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `node index.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR! /home/samenty/.npm/_logs/2019-12-27T08_43_40_203Z-debug.log
Dit is niet een triviale manier die veel toegepast wordt. Is er ook een documentatie over? En wat geeft de log aan?

Zelf raad ik shell-access en dus minimaal een VPS aan.
Dat raadde mijn vorige hosting ook aan, maar VPS is denk ik ver boven mijn pet.
Ben inmiddels best wel aardig in PHP, HTML en CSS (jQuery beginnend) maar van onderliggende systemen de ballen verstand. En dan is een VPS best duur... Daarom heb ik een hosting gezocht (en gevonden) met node.js reeds draaiend. En een goed bedieningspaneel waar ik dus wel index.js kan runnnen... maar die dependencies{} kloppen niet of zo?
DirectAdmin is nog best eenvoudig te beheren via simpele commands in SSH.

Maar meldt de genoemde log nog wat spannends? Kijk ook even het juiste pad na van socket.io.

Reageren