Red de conocimiento informático - Problemas con los teléfonos móviles - ¿Socketio no es un websocket estándar? ¿Por qué el cliente escrito en Java no puede conectarse?

¿Socketio no es un websocket estándar? ¿Por qué el cliente escrito en Java no puede conectarse?

PHP tiene una biblioteca websocket disponible, no se requiere php-fpm.

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>

}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ó");

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

}

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++;

}

}

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;

}

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