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).

0voto

carlossevi comentado

¿Has consultado la consola de tu navegador a ver si devuelve algún error?

0voto

desarrollador1990 comentado

Hola que tal carlossevi,

Te comento si que consigo una conexión entre el servidor PHP y el cliente java por medio de la linea de comandos, es mas puedo enviar datos y recibirlos por consola en ambos también, el problema llega cuando desde una vista quiero interactuar con el servidor vía ajax para que este se los pase al cliente.

Por decirlo de alguna manera no consigo mandarle las ordenes desde jquery ajax al servidor.

Por ejemplo tengo una vista con boton1, boton2 y boton3, quiero que al hacer click por ejemplo sobre el boton2 envié por ajax el parámetro 2 al servidor y este envié por sockets al cliente un 2. Pero no lo consigo.

0voto

carlossevi comentado

Te preguntaba sobre la consola del navegador que debe mostrar algún error en la llamada post o en la ejecución de Javascript.

Viendo el código, me parece que

$.post("{{proyectodam/app/Lib/ServerSocket.php}}", {op: 1});

debería ser:

$.post("proyectodam/app/Lib/ServerSocket.php", {op: 1});

0voto

desarrollador1990 comentado

En la consola solo me aparece este error 1111.2222.3444.0001:134 Uncaught ReferenceError: $ is not defined

Es como si no me funcionara el Jquery.

Tengo este script antes de la peticion ajax y funciona pero añado un alert y no se ejecuta nunca.

@extends('layout.admin')

@section('content')
    <div class="container">
        <h2>Funciones sobre el alumno</h2>
        <ul class="nav nav-tabs">
            <li class="active"><a href="#home" data-toggle="tab">Chat</a></li>
            <li><a href="#menu1" data-toggle="tab">Información</a></li>
            <li><a href="#menu2" data-toggle="tab">Envio mensajes</a></li>
            <li><a href="#menu3" data-toggle="tab">Capturar pantalla</a></li>
        </ul>

        <div class="tab-content">
            <div id="home" class="tab-pane fade in active">
                @include('tab.funciones.chat')
            </div>
            <div id="menu1" class="tab-pane fade">
                @include('tab.funciones.informacion')
            </div>
            <div id="menu2" class="tab-pane fade">
                @include('tab.funciones.mensajes')
            </div>
            <div id="menu3" class="tab-pane fade">
                @include('tab.funciones.pantalla')
            </div>
        </div>
    </div>
    <script type="text/javascript">
    $(document).ready(function(){
        alert(1);
        $(".nav-tabs a").click(function(){
            $(this).tab('show');
        });

        $("#bloquear").click(function(e){
            $.post("{{ url('http://localhost/proyectodam/app/Lib/ServerSocket.php') }}", {op: 1});
        });
    });
    </script>
@endsection

pd: Te pongo toda la vista haber si necesitas algo.

0voto

carlossevi comentado

Bueno, pues ya tienes algo por donde ir tirando =) ¿Y dices que el evento clic sobre ".nav-tabs a" sí que se ejecuta bien?

0voto

desarrollador1990 comentado

Si que funciona el evento tab pero por data-toggle="tab"

0voto

carlossevi comentado

Revisa que se esté cargando la referencia a jQuery, porque en los fragmentos que nos has copiado eso no se alcanza a ver.

0voto

desarrollador1990 comentado

En mi plantilla admin la cual extiendo si que la tengo incorporada al final del </body>

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

cuando hago click derecho sobre la pagina ver código fuente y me desplazo hacia el link del jquery y pincho si que me abre el fichero, eso quiere decir que me lo carga.

1voto

carlossevi comentado

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

1voto

desarrollador1990 comentado

Si que me lo abre

1voto

carlossevi comentado

¿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".

1voto

desarrollador1990 comentado

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)

1voto

desarrollador1990 comentado

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 Puntos63580

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

0voto

desarrollador1990 comentado

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

0voto

carlossevi comentado

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.

0voto

desarrollador1990 comentado

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

0voto

carlossevi comentado

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

0voto

desarrollador1990 comentado

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"] ?

0voto

carlossevi comentado

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.

0voto

desarrollador1990 comentado

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.

0voto

carlossevi comentado

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.

0voto

desarrollador1990 comentado

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

De nuevo gracias!.

1voto

carlossevi comentado

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

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

Otras Preguntas y Respuestas


...

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

Conecta