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

2votos

Enviar datos por Ajax a un archivo PHP no controlador ni clase en Laravel 5.1

Hola otra vez,

Esta vez vengo con un problema que no me deja continuar...Tengo implementado un servidor socket y un cliente java, la conexión y todo funciona correctamente y el envió de datos y todo...El problema biene cuando deseo enviar una orden desde ajax al servidor para que este se lo envie al cliente. El archivo PHP que hace de rol de servidor lo tengo en el "namespace proyectodam\Lib;" es decir es una libreria mia que no es un controlador ni una clase.

Desde la vista

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

ServerSocket.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"])){
          $message = 1;
          socket_write($client, $message, strlen($message));
      }
      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();
        }
    }
}

Pues no consigo interceptar desde el servidor la solicitud ajax que hago desde jquery al servidor para que luego este se lo envie al cliente(java).

carlossevi comentado Ago 30, 2016

Compruebalo en la página que se carga en el navegador, y revisar que la URL resuelve correctamente.

desarrollador1990 comentado Ago 30, 2016

Si que me lo abre

carlossevi comentado Ago 30, 2016

¿Podríamos tener acceso a la página generada? En caso contrario es muy difícil ir dando palos de ciego. Te recomiendo buscar tu error en Google: "Uncaught ReferenceError: $ is not defined".

desarrollador1990 comentado Ago 30, 2016

Carlossevi no tengo ningún problema, ahora intentare subirla algún repositorio aunque nunca he utilizado ninguno. La tengo en localhost.

El problema creo que ha de ser que no me funciona el jquery porque por consola no veo que haga ninguna petición vía ajax(viéndolo en XHR)

desarrollador1990 comentado Ago 30, 2016

carlossevi ya he logrado hacer funcionar jquery. Mobiendo las referencias hacia los archivos al principio del <body> buscando por lo que me dijiste ;)

<script src="{{ url('assets/js/jquery.min.js') }}"></script>
<script src="{{ url('assets/js/bootstrap.min.js') }}"></script>
<script src="{{ url('assets/js/metisMenu.min.js') }}"></script>
<script src="{{ url('assets/js/sb-admin-2.js') }}"></script>

Ahora en el XHR de la petición ajax me sale en rojo status 404 como que no ha llegado a el archivo en cuestión(ServerSocket.php) que lo tengo en namespace proyectodam\Lib; del proyecto.

¿Como consigo llegar a el?

1 Respuesta

1voto

carlossevi Puntos61050

No le veo sentido a la siguiente línea de Javascript: $.post("{{ url('http://localhost/proyectodam/app/Lib/ServerSocket.php') }}", {op: 1});

Según la documentación de la función url() (https://laravel.com/docs/5.3/helpers#method-url) la función sirve para generar la URL de una ruta. No tiene sentido que como argumento le pases la URL, porque si ya tienes la URL no necesitas la función.

Tienes dos opciones, pasar directamente la URL o calcularla:

$.post("http://localhost/proyectodam/app/Lib/ServerSocket.php", {op: 1});
$.post("{{ url('path/que/corresponda/Laravel') }}", {op: 1});

desarrollador1990 comentado Ago 30, 2016

carlossevi perfecto la petición ahora es de status 200

Vale ahora si que llego al archivo ServerSocket.php, pero si yo tengo el servidor socket corriendo por linea de comando yo puedo enviarle datos vía ajax para que pueda enviárselos al cliente?

Lo digo porque me arroja ahora la consola este error.

C:\xampp\php>php.exe -q C:\xampp\htdocs\proyectodam\app\Lib\ServerSocket.php

Warning: socket_bind(): unable to bind address [10048]: S¾lo se permite un uso d
e cada direcci¾n de socket (protocolo/direcci¾n de red/puerto)
in C:\xampp\htdocs\proyectodam\app\Lib\ServerSocket.php on line 11
Could not bind to address

carlossevi comentado Ago 30, 2016

No puedes tener dos instancias del socket intentando reservar y escuchar el mismo puerto. Creo que estás confundiendo tu arquitectura.

Lo que estás intentando montar:

  • Servidor ServerSocket.php que escucha peticiones y lanzas desde la consola.
  • Cliente Java que conecta y envía datos al ServerSocket.php.
  • Cliente web que ejecuta script ServerSocket.php, error.

El cliente web debería ejecutar un script PHP que pueda ser ejecutado en paralelo, no puede ejecutar el script servidor que queda a la escucha. Tiene que ejecutar un script que se inicie, haga sus tareas y termine. Entre las tareas podría estar el conectar y enviar datos vía socket a ServerSocket.php, aunque lo veo muy enrevesado.

desarrollador1990 comentado Ago 30, 2016

En el servidor ServerSocket esto no funcionaria?

if(isset($_POST["op"]) && $_POST["op"] == 1){
    $message = $_POST["op"];
    socket_write($client, $message, strlen($message));
}

No me estoy conectando desde un cliente web si no le estoy pasando un parámetro vía ajax al script ServerSocket.php

carlossevi comentado Ago 30, 2016

¿En serio http://localhost/proyectodam/app/Lib/ServerSocket.php no es una conexión web vía HTTP? Revisa el concepto.

desarrollador1990 comentado Ago 30, 2016

Perdón si si que es vía HTTP me pensé que dijiste cliente socket.

if(isset($_POST["op"]) && $_POST["op"] == 1){
    $message = $_POST["op"];
    socket_write($client, $message, strlen($message));
}

Porque no envía al cliente Java lo que le paso al ServerSocket vía ajax? No entiendo el problema, se supone que ServerSocket escribirá al cliente java cuando le lleguen datos por $_POST["op"] ?

carlossevi comentado Ago 30, 2016

Tienes dos aplicaciones que conectas por socket ¿Pero cuál de las dos hace de servidor? En caso de que sea el script ServerSocket.php tal y como he entendido (y así se refleja en el código socket_listen()) acude 4 comentarios más arriba y vuelve a leer el problema de la arquitectura.

desarrollador1990 comentado Ago 30, 2016

SeverSockte.php hace de servidor si. ya lo entendí.

Que solución me recomiendas? por que estoy haciendo todo lo posible para poder conectar un cliente en Java con un servidor PHP y poder manejar el cliente Java vía web no por linea de comando(por que por linea de comando si lo logro).

He intentado de todo websockets, node.js y ahora con PHP. De verdad ya no se como hacerlo, es que es imposible manejar de manera remota a clientes conectados desde una interfaz vía web?

Porque lo que son las conexiones las logro pero no me sirve por linea de comando necesito interactuar vía web para enviar las ordenes al cliente Java.

carlossevi comentado Ago 30, 2016

Tu pregunta es compleja y escapa al alcance de tu pregunta inicial. No hay una solución única y es necesario conocer más sobre el problema para dar una opinión.

Por favor, comprueba si tu consulta sobre "Enviar datos por Ajax a PHP en Laravel" ha sido aclarada o si necesitas más explicaciones.

Si quieres, puedes abrir una nueva cuestión, aportar información sobre lo que tienes, quieres y pedir ayuda para conseguirlo.

desarrollador1990 comentado Ago 30, 2016

carlossevi muchas gracias por el apoyo. Abriré otra pregunta.

De nuevo gracias!.

carlossevi comentado Sep 1, 2016

Si esta pregunta está solucionada, márcala como tal.

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

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


Otras Preguntas y Respuestas


Actividad Reciente

...

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

Conecta