entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Consigo enviar datos por ajax(jquery) al servidor TCP el cual esta corriendo por linea de comandos, pero al parecer el servidor es incapaz de manejarlos.

Desde este JS/HTML pretendo enviar datos al servidor.

<script type="text/javascript">
    $(document).ready(function(){
        $("#bloquear").click(function(){
            $.post("http://localhost/proyectodam/app/Lib/ServerSocket.php", {op: 1});
        });
    });
</script>

Servidor en PHP.

<?php 
namespace proyectodam\Lib;

try{
    set_time_limit(0);
    $address = '127.0.0.1';
    $port = 5555;
    // Create a TCP Stream socket
    $sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); // 0 for  SQL_TCP
    // Bind the socket to an address/port
    socket_bind($sock, $address, $port) or die('Could not bind to address');  //0 for localhost
    // Start listening for connections
    socket_listen($sock);
    //loop and listen
    while(true){
      /* Accept incoming  requests and handle them as child processes */
      $client = socket_accept($sock);
      //$_SESSION[socket_getpeername($client, AF_INET, 5555)] = socket_getpeername($client, AF_INET, 5555);
      // Read the input  from the client – 1024000 bytes
      //$input = socket_read($client, 1024000);
      // from here you need to do your database stuff
      // and handle the response 

       // Display output  back to client
      if(isset($_POST["op"]) && $_POST["op"] == 1){
          $message = $_POST["op"];
          socket_write($client, $message, strlen($message));
        //echo json_encode("si");
      }
      socket_close($client);
    }
    // Close the master sockets
    socket_close($sock);
}catch(Exception $e){
    echo 'Excepción capturada: ',  $e->getMessage(), "\n";
}

Cliente en Java.

public class ClienteSocket{

    public static void main(String args[]){

        try {
            Socket client = new Socket("127.0.0.1", 5555);

            BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
            OutputStreamWriter wr = new OutputStreamWriter(client.getOutputStream());

            String op;
            while((op = in.readLine()) != null){
                System.out.println(op);
            }

        }catch (IOException e){
            System.out.println("error");
            e.printStackTrace();
        }
    }
}

¿Como podría el servidor interceptar los datos que le llegan por ajax y una vez obtenidos enviarlos al cliente Java?

pd: Siento si estoy ensuciando el foro con redundancia.

1 Respuesta

2votos

carlossevi Puntos53490

En mi opinión, tienes 2 procesos:

  1. Comunicación entre cliente web y servidor web.
  2. Comunicación entre cliente java y servidor, vía socket.

¿Por qué necesitas que el servidor que escucha a ambos clientes sea exactamente el mismo script? En la anterior pregunta se veía que te estabas metiendo en un problema porque el mismo fragmento de código no te servía para atender a las dos peticiones.

Por definición un script PHP que se ejecuta a través de un servidor web (llamada HTTP) tiene que soportar llamadas paralelas, mientras que el script PHP que en tu caso escucha el puerto 5555 solo admite una instancia porque solo hay un puerto 5555, y esa instancia se está ejecutando en la consola.

Aunque sea el mismo lenguaje o incluso el mismo framework yo separaría el servidor en dos scripts o programas distintos. Por un lado, escucharía peticiones web y por otro escucharía peticiones socket. ¿Cómo pasar los datos de un sitio al otro? Pues busca algún tipo de persistencia que te lo permita, como almacenarlos en el sistema de ficheros o en una base de datos.

desarrollador1990 comentado Ago 31, 2016

Pero por lo que he tenido ocasión de leer una conexión HTTP internamente hace uso de sockets TCP.

Estas funciones pueden hacer que se libere el socket TCP y lo deje abierto a HTTP pasa obtener los datos y pasarlos por el socket TCP?

fsockopen()
socket_set_nonblock()

carlossevi comentado Sep 1, 2016

Te estás liando cada vez un poco más. HTTP es un protocolo de comunicación que aunque utilice sockets, lo hace de forma totalmente transparente para ti como desarrollador. Es una comunicación entre el cliente (navegador web) y servidor (servidor web, en este caso el que viene incrustado con Laravel).

https://es.wikipedia.org/wiki/Socket_de_Internet
https://es.wikipedia.org/wiki/Hypertext_Transfer_Protocol
https://es.wikipedia.org/wiki/Servidor_web

desarrollador1990 comentado Sep 6, 2016

Hola que tal carlossevi,

Siento no haber respondido antes(estuve de vacaciones). Entonces zanjando el tema lo que me quieres decir es que mi servidor no puede atender dos tipos de peticiones diferentes(1 HTTP, 2 TCP) si es asi dime que "SI".

Por otro lado la opción de pasar datos por medio de un sistema de persistencia yo lo había pensado hace tiempo, pero tengo entendido que la comunicación seria lenta por no ser directa, es decir tiene que realizar una serie de pasos:

1- Abrir el fichero.
2- Escribir la orden en el fichero.
3- Cerrar el fichero.

Esto en el mejor de los casos, por que si decidiera hacerlo mediante una BD seria peor el remedio ya que consume mas recursos(Establecer conexión con BD, etc...)

Creo que cuando se crearon los sockets para PHP no fueron creados para ser utilizados desde la consola, si no por medio de una interfaz grafica(En este caso desde HTML, por medio de Ajax o algo así que permitiera ser el que envié la orden).

Espero su respuesta, un saludo!

carlossevi comentado Sep 6, 2016

"NO", claro que puede atender varios tipos de peticiones, pero cada una por su puerto. Lo que tu estás intentando:

  • Desde la consola se abre un socket (modo servidor) que escucha por el puerto 5555.
  • El servidor web escucha peticiones por el puerto 80.
  • Por cada petición que recibe el servidor web, intentas volver a abrir el socket en modo servidor en el puerto 5555 y da error porque está en uso.

Bajo mi punto de vista hay dos formas de uso de PHP y sockets:

  • Socket realizando el papel del servidor, se debe quedar escuchando y solo le veo sentido a ser lanzado desde consola, es decir, una única instancia por puerto.
  • Socket realizando el papel del cliente (se conecta a servidores e intercambia información). En este caso sí que se pueden crear varias instancias y tendría sentido que sea ejecutado por un script desde un servidor web.

desarrollador1990 comentado Sep 6, 2016

Perdona, yo vengo de Java y me cuesta un poco...

Un ejemplo, yo en Java puedo tener un socket servidor que tenga un InputStream asignado a un fichero, linea de comando etc... y recuperar este dato y almacenarlo en una variable, luego desde el servidor puedo enviar el contenido de esa variable al cliente desde su OutputStream del socket cliente hacia el cliente.

carlossevi comentado Sep 6, 2016

Si no quieres hacer persistencia, podrías hacer:

  1. Comunicación entre cliente web y servidor web, se envía el dato por ajax.
  2. El script PHP del servidor web procesa el dato y lo envía por socket (modo cliente) al servidor que escucha en el puerto 5555. Por casualidad, el servidor socket también está programado en PHP, pero son elementos diferentes.
  3. Comunicación entre cliente java y servidor, vía socket. Cada vez que el servidor recibe un dato de un cliente web, se lo envía al cliente java.

Con esa arquitectura el dato lo envías por socket de un script PHP al otro, pero no le veo ventajas (quizá tampoco en rendimiento) frente a persistirlo en un sistema de ficheros o una base de datos. ¿Cuantos miles de registros vas a enviar por segundo para que te preocupe tanto el rendimiento de la persistencia?

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta