【问题标题】:Event Emitter in JavaJava 中的事件发射器
【发布时间】:2020-05-11 18:51:40
【问题描述】:

我目前正在将 NodeJS 项目转换为 Java。目前我被困在一个我没有找到解决方案的问题中。 在我的 Node 项目中,我有一个与 EventEmitter(require('events')) 和 Net Sockets (require("net")) 一起使用的函数,并使用“emit”函数发送消息和“on”接收消息。我怎样才能在 Java 中做同样的事情???

【问题讨论】:

    标签: java node.js events emit emitter


    【解决方案1】:

    也许你会需要这样的:

    服务器端:

    import java.io.*;
    
    public class Conex {
    
    final int PUERTO=5000;
    
    ServerSocket sc;
    
    Socket so;
    
    DataOutputStream salida;
    
    String mensajeRecibido;
    
    //SERVIDOR
    
    public void initServer()
    
    {
    
    BufferedReader entrada;
    
    try
    
    {
    
    sc = new ServerSocket(PUERTO );/* crea socket servidor que escuchara en puerto 5000*/
    
    so=new Socket();
    
    System.out.println("Esperando una conexión:");
    
    so = sc.accept();</pre>
    <pre class="brush:java">//Inicia el socket, ahora esta esperando una conexión por parte del cliente
    
    System.out.println("Un cliente se ha conectado.");
    
    //Canales de entrada y salida de datos
    
    entrada = new BufferedReader(new InputStreamReader(so.getInputStream()));
    
    salida = new DataOutputStream(so.getOutputStream());
    
    System.out.println("Confirmando conexion al cliente....");
    
    salida.writeUTF("Conexión exitosa...n envia un mensaje :D");
    
    //Recepcion de mensaje
    
    mensajeRecibido = entrada.readLine();
    
    System.out.println(mensajeRecibido);
    
    salida.writeUTF("Se recibio tu mensaje.n Terminando conexion...");
    
    salida.writeUTF("Gracias por conectarte, adios!");
    
    System.out.println("Cerrando conexión...");
    
    sc.close();//Aqui se cierra la conexión con el cliente
    
    }catch(Exception e )
    
    {
    
    System.out.println("Error: "+e.getMessage());
    
    }
    
    }
    
    }
    

    客户端:

    import java.io.*;
    
    public class Conex {
    
    final String HOST = "localhost";
    
    final int PUERTO=5000;
    
    Socket sc;
    
    DataOutputStream mensaje;
    
    DataInputStream entrada;
    
    //Cliente
    
    public void initClient() /*ejecuta este metodo para correr el cliente */
    
    {
    
    try
    
    {
    
    sc = new Socket( HOST , PUERTO ); /*conectar a un servidor en localhost con puerto 5000*/
    
    //creamos el flujo de datos por el que se enviara un mensaje
    
    mensaje = new DataOutputStream(sc.getOutputStream());
    
    //enviamos el mensaje
    
    mensaje.writeUTF("hola que tal!!");
    
    //cerramos la conexión
    
    sc.close();
    
    }catch(Exception e )
    
    {
    
    System.out.println("Error: "+e.getMessage());
    
    }
    
    }
    
    }
    

    【讨论】:

      【解决方案2】:

      对于使用 GET 方法接收消息:

      import javax.ws.rs.Consumes; 
      import javax.ws.rs.GET; 
      import javax.ws.rs.Path; 
      import javax.ws.rs.Produces; 
      import javax.ws.rs.core.MediaType; 
      import javax.ws.rs.core.Response; 
      
      @Path("/helloworld") 
      @Produces(MediaType.APPLICATION_JSON) 
      @Consumes(MediaType.APPLICATION_JSON) 
      public class HelloWorldRest {               
      
          @GET  
          public Response sayHello() {     
              return Response.ok("Hello World desde el API REST",MediaType.APPLICATION_JSON).build();   
          } 
      }
      

      对于使用 POST 方法发送消息:

      @POST
      public Response createUser(User userRequest) {
          userRequest.setId(users.size()+1l);
          this.users.add(userRequest);
          return Response.ok(userRequest).build();
      }
      

      【讨论】:

      • 嗨@adriangc24。抱歉,但我认为这对我不起作用。我想我需要一些与 Sockets 相关的东西
      【解决方案3】:

      这实际上取决于此应用程序的扩展方式。你有几个选择:

      1.休息 您可以调用 REST API 来发送事件,而不是发出。 要接收,您可以托管一项服务,对方在完成事件后将调用该服务。

      在这种方法中需要注意的一件事是错误处理。如果由于 REST API 已关闭或超时而未发出事件,您会怎么做。如果您无法将此错误传播到客户端并让他们重试...那么您将需要实现重试机制。

      2。内存队列 如果这是一个单实例应用程序,您只想在处理请求时发出事件移动到手头的下一个任务,并且没有其他实例会干扰或受到这项工作的影响,那么您可以选择使用 in-内存队列。您需要一个具有相同和类似设置的侦听器来接收您的事件。如果您希望其他可免费服务的实例来帮助处理其中一个事件,这实际上是不可扩展的。此外,如果由于任何原因此 JVM 在运行中死机,请求将进入并出错(同样适用于 #1)

      3. JMS/卡夫卡 如果这是一个大型应用程序,具有帮助不同任务的独立进程并且这些进程必须是异步的,那么请考虑使用持久队列或像 kafka 这样的流。

      所有这些方法都是可行的,但您需要查看您的场景,然后应用其中一种。其中每一项都需要在弹性/基础设施维护方面产生成本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-31
        相关资源
        最近更新 更多