¿Socketio no es un websocket estándar? ¿Por qué el cliente escrito en Java no puede conectarse?
En la actualidad, los más maduros incluyen Swoole (swoole.com) y Workman (workman.net).
Swoole es una extensión PHP escrita en C, que es más eficiente que nodejs. Workman es una implementación PHP pura, y ambos afirman ser capaces de lograr millones de conexiones TCP simultáneas.
Déjame darte un ejemplo:
Olvidé un poco los parámetros para que esta banda específica se ejecute a través de cmd.
<? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)
Informe de errores (E_ALL);
set_time_limit(0);
ob _ implicit _ Flush( );
//Crea una conexión de socket, establece el enlace de parámetros, escucha y regresa.
$master = WebSocket("localhost ", 12345);
//Indica si se ha completado el protocolo de enlace.
$ is _ shaked = false
//¿Se ha cerrado?
$ is _ cerrado = true
//Cambie el socket a un socket disponible.
while(true){
// Si está cerrado y no hay protocolo de enlace, crea un socket utilizable (parece que la segunda condición se puede eliminar)
if ($ está _ cerrado && $is_shaked){
if (($sock = socket_accept($master))<0){
echo "socket_accept( ) falló: Motivo:". socket_strerror($calcetín). "\n";
}
//Cambiar el estado cerrado a falso.
$ is _ cerrado = false
}
//Iniciar procesamiento de datos.
Proceso($sock);
}
//Función para manejar la solicitud
Función proceso($socket){< / p>
//Obtiene variables globales de la primera.
Global $is_closed, $is_shaked
//Obtener datos del socket
$buffer = socket_read($socket, 2048);
p>
// Si el valor de retorno del búfer es falso y el protocolo de enlace se ha completado, desconéctese.
if (!$ buffer & amp& amp$is_shaked){
desconectar($socket);
}else{
/ /Si no hay un apretón de manos, estreche la mano y modifique el estado del apretón de manos.
if($is_shaked == false){
$ return _ str = hacer apretón de manos($ buffer);
$ is _ shaked = true p>
p>
}De lo contrario{
//Si se ha realizado el apretón de manos, envíelo a la función de negociación para el procesamiento correspondiente.
$ data _ str = decode($ buffer); //Analiza el contenido enviado por el front-end
Consola($ data _ str
); $ return _ str = codificar(trato($ socket, $ data _ str));
//$ return _ str = codificar($ data _ str)); /p >
//Escribe la cadena que debe devolverse al socket para su devolución.
socket_write($socket, $return_str, strlen($ return _ str));
}
}
Función transacción ( $socket, $msgObj){
$obj = JSON_decode($msgObj);
foreach($obj as $key = >$valor){
if($key == 'cerrar'){
Desconectar($socket);
Consola("Cerrar correctamente");
Devolver "Cerrar exitosamente";
}else if($key == 'msg'){
Consola(valor. "\n");
Devolver valor $
}
}
}
//Obtener información del encabezado
Función getheaders($req){
$ r = $ h = $ o = null
if(preg_match("/GET(.*) HTTP/", $req, $match)){ $r = $match[1];}
if(preg_match("/Host:(.*)\r\n/",$req,$match)){ $ h = $match[1]; }
if(preg_match("/Origin:(.*)\r\n/", $req, $match)){ $o = $match[1 ];}
if(preg_match("/Sec-web socket-Key:(.*)\r\n/", $req, $match)){ $key = $match[ 1];}
if(preg_match("/\r\n(.*?)\$/", $req, $match)){ $data = $match[1];}
Devolver matriz ($ r, $h, $o, $clave, $datos);
}
Función WebSocket($dirección, $puerto){
$master= socket_create(AF_INET, SOCK_STREAM, SOL_TCP) o die("socket_create() falló");
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1) o die( "socket_option() falló"); p>
socket_bind($master, $dirección, $puerto) o die("socket_bind() falló");
socket_listen($master, 20) o die("socket_listen() falló" );
Echo "El servidor se ha iniciado:". fecha('Y-m-d H:i:s '). "\n";
Eco "zócalo primario:". $maestro.
"\n";
echo "Escuchando:". $dirección. "puerto". $puerto. "\n\n";
Devuelve $master
}
Función dohandshake($buffer){
lista($recurso , $host, $origin, $key, $data)= get headers($buffer);
echo "El recurso es $resource\n";
echo "el origen es $ origen\n";
echo "El host es $host\n";
echo "la clave es $key\n\n";
$ respuesta _ clave = base64 _ encode(sha 1($key. 258 eafa 5-e 914-47DA-95CA-C5 ab 0 DC 85 b 11 ', verdadero);
$ return _ str = " HTTP/1.1 101 protocolo de intercambio\r\n ".
Actualización: websocket\r\n.
Conexión: actualización\r\n.
" Sec-web socket-Aceptar:$ respuesta _ clave \ r \ n \ r \ n";
return $ return _ str
}
Control de funciones Taiwán($msg){
$ msg = transToGBK($ msg);
Echo " $ msg \ n "
Devolver $ msg p >
}
Decodificación de funciones ($msg="") {
$ máscara = array();
$ datos =
$msg = desempaquetar("H* ",$msg);
$head = substr($msg[1],0,2);
if( hexadecimal dec $ cabeza { 1 })= = = 8){
$ datos = false
} else if(hex dec $ cabeza { 1 })= = = 1){
$ máscara[]= dec hexadecimal(substr($ msg[1], 4, 2));
$ máscara[]= dec hexadecimal(substr($ msg[1 ] , 6, 2));
$ máscara[]= hex dec(substr($ msg[1], 8, 2));
$ máscara[]= hexadecimal (substr($ mensaje[1], 10, 2));
$ s = 12;
$ e = strlen($ mensaje[1])-2; p>
$ n = 0;
for($ I = $ s; $ i & lt= $ e; $i+= 2){
$datos. = chr($máscara[$n%4]^hexdec(substr($msg[1],$i,2)));
$ n++;
} p>
}
Devolver $datos
}
Codificación de función ($msg= " ")
$ frame = matriz();
$ marco[0]= "81";
$MSG.
= 'puede';
$ len = strlen($ msg);
$ marco[1]= $ len & lt;16?"0".dechex($ len) :dechex($len);
$frame[2]= ord_hex($msg);
$data = implosion(",$frame);
return pack("H* ",$data);
}
Función transToGBK($ s){//UTF8->GBK
/ /echo $s;
return iconv("UTF-8", "GBK", $s);
return $s;
} p>
Orden de funciones _ hexadecimal($ datos){
$ msg =
$ l = strlen($ datos);
for($ I = 0; $ i & lt$ l; $i++){
//ord es el valor ascii del primer carácter de la cadena devuelta
// dechex convierte decimal. a hexadecimal
$msg. = dechex(ord($data {$I});
}
Devuelve $ msg
}
función de desconexión($socket){
global $is_shaked, $is_closed
$ is _ shaked = false
$ is _ cerrado = verdadero
socket _ close($ socket);
}
& gt