0

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

4

3 回答 3

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

}

}

}
于 2020-05-11T19:28:18.250 回答
0

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

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

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

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

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

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

于 2020-05-11T19:16:17.603 回答
0

使用 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();
}
于 2020-05-11T19:01:12.427 回答