Hallo mein Problem.
Ich möchte eine AJAX-Routine mit Long Polling durch ein websocket ersetzen.
Ich habe nur einen Webspace und verwende kein JQuery!
Um das zu testen habe ich erst einmal ein Chat Beispiel abgewandelt.
Mein System ist ein Debian Stretch Linux i7-graf-st-dh 4.9.0-2-amd64 #1 SMP Debian 4.9.18-1 (2017-03-30) x86_64 GNU/Linux
beim Provider läuft ein Ubuntu Linux sh4-17 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64
Der Aufbau des Socket-Servers mittels PHP klappt sowohl auf meinem lokalen Entwicklungsserver als auch beim Provider.
Der Server wird gestartet per
exec(sprintf("%s > %s 2>&1 & echo $1", "nohup " .$cmd, $outputfile,$pidArr));
das führt zu
nohup php -q /hp/ao/ae/........../socket_chat/server_plain.php 2>&1
Der Process erscheint bei einem
ps -axo pid,ppid,command | grep "socket_chat/server_plain.php" | grep -v "grep"
mit seiner PID und der PPID 1, wurde also dem initprozess zugeordnet.
Der Socketserver beendet sich nach 120 Sekunden Leerlauf und kann auch über die Webseite vorzeitig gekillt werden.
Um meiner lokalen Maschine funktionieren auch die Clients. Ich kann mehrere Clients starten, chaten und beenden.
Das Problem tritt bereits bei der Übergabe der wsURI auf (websocket = new WebSocket(wsUri); ) .
Der Port und die IP für den Socket wird aus einer Datei gelesen, in die der Server die Daten abgelegt hat.
{"pid":1799,"serv_ip":"178.254.11.38","port":36477 }
- die serv_ip wird als host übergeben,
- port der entsprechende Port
- pid wird nur für den Kill der Servers benötigt
function build_socket(prot,host,port){
//create a new WebSocket object.
if(tracelog) tracer(ln()+" "+port);
var wsUri = prot+"://"+host+":"+port+"/ ...... / socket_chat/server_plain.php";
if(tracelog) tracer(ln()+" "+wsUri+"\n");
alert(wsUri);
try {
websocket = new WebSocket(wsUri);
if(tracelog) tracer(ln()+" "+(typeof websocket)+" "+(websocket?"true":"false"));
websocket.onopen = function(ev) { // connection is open
if(tracelog) tracer(ln()+" "+(ev.code));
app_div("message_box","system_msg","Connected! port=" +port ); //notify user
if(tracelog) tracer(ln()+" Connected "+port);
}
/* Hier werden alle weiteren Eventhandler für das Socket aufgesetzt
Es wird aber beim Provider sofort der Catch ausgeführt
Während es lokal funktioniert.
*/
} catch (e){
var reason=get_reason(e); // // See http://tools.ietf.org/html/rfc6455#section-7.4.1
if(tracelog) tracer(ln()+" Socket Fehler catched "+e.code+" Reason="+reason);
}
Socket Fehler catched 18 Reason=undefined
Fehlercodes section-7.4.1 sind von 1000 bis 1015.
0-999 Status codes in the range 0-999 are not used.
Im Moment habe ich keine Idee mehr wo ich noch suchen soll.
Ich würde mich über einen Input freuen.
Ich möchte eine AJAX-Routine mit Long Polling durch ein websocket ersetzen.
Ich habe nur einen Webspace und verwende kein JQuery!
Um das zu testen habe ich erst einmal ein Chat Beispiel abgewandelt.
Mein System ist ein Debian Stretch Linux i7-graf-st-dh 4.9.0-2-amd64 #1 SMP Debian 4.9.18-1 (2017-03-30) x86_64 GNU/Linux
beim Provider läuft ein Ubuntu Linux sh4-17 4.4.0-72-generic #93-Ubuntu SMP Fri Mar 31 14:07:41 UTC 2017 x86_64
Der Aufbau des Socket-Servers mittels PHP klappt sowohl auf meinem lokalen Entwicklungsserver als auch beim Provider.
Der Server wird gestartet per
exec(sprintf("%s > %s 2>&1 & echo $1", "nohup " .$cmd, $outputfile,$pidArr));
das führt zu
nohup php -q /hp/ao/ae/........../socket_chat/server_plain.php 2>&1
ps -axo pid,ppid,command | grep "socket_chat/server_plain.php" | grep -v "grep"
mit seiner PID und der PPID 1, wurde also dem initprozess zugeordnet.
Der Socketserver beendet sich nach 120 Sekunden Leerlauf und kann auch über die Webseite vorzeitig gekillt werden.
Um meiner lokalen Maschine funktionieren auch die Clients. Ich kann mehrere Clients starten, chaten und beenden.
Das Problem tritt bereits bei der Übergabe der wsURI auf (websocket = new WebSocket(wsUri); ) .
Der Port und die IP für den Socket wird aus einer Datei gelesen, in die der Server die Daten abgelegt hat.
{"pid":1799,"serv_ip":"178.254.11.38","port":36477 }
- die serv_ip wird als host übergeben,
- port der entsprechende Port
- pid wird nur für den Kill der Servers benötigt
function build_socket(prot,host,port){
//create a new WebSocket object.
if(tracelog) tracer(ln()+" "+port);
var wsUri = prot+"://"+host+":"+port+"/ ...... / socket_chat/server_plain.php";
if(tracelog) tracer(ln()+" "+wsUri+"\n");
alert(wsUri);
try {
websocket = new WebSocket(wsUri);
if(tracelog) tracer(ln()+" "+(typeof websocket)+" "+(websocket?"true":"false"));
websocket.onopen = function(ev) { // connection is open
if(tracelog) tracer(ln()+" "+(ev.code));
app_div("message_box","system_msg","Connected! port=" +port ); //notify user
if(tracelog) tracer(ln()+" Connected "+port);
}
/* Hier werden alle weiteren Eventhandler für das Socket aufgesetzt
Es wird aber beim Provider sofort der Catch ausgeführt
Während es lokal funktioniert.
*/
} catch (e){
var reason=get_reason(e); // // See http://tools.ietf.org/html/rfc6455#section-7.4.1
if(tracelog) tracer(ln()+" Socket Fehler catched "+e.code+" Reason="+reason);
}
Fehlercodes section-7.4.1 sind von 1000 bis 1015.
0-999 Status codes in the range 0-999 are not used.
Im Moment habe ich keine Idee mehr wo ich noch suchen soll.
Ich würde mich über einen Input freuen.
Kommentar