我目前正在将 NodeJS 项目转换为 Java。目前我被困在一个我没有找到解决方案的问题中。在我的 Node 项目中,我有一个与 EventEmitter(require('events')) 和 Net Sockets (require("net")) 一起使用的函数,并使用“emit”函数发送消息和“on”接收消息。我怎么能在Java中做同样的事情???
3 回答
也许你会需要一些这样的:
服务器端:
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());
}
}
}
这实际上取决于如何扩展此应用程序。你有几个选择:
1. REST 您可以调用 REST API 来发送事件,而不是发出。要接收,您可以托管一项服务,对方在完成事件后将调用该服务。
在这种方法中需要注意的一件事是错误处理。如果您的事件由于 REST API 已关闭或超时而未发出,您会怎么做。如果您无法将此错误传播到客户端并让他们重试...那么您将需要实现重试机制。
2. 内存队列 如果这是一个单实例应用程序,您只想在处理请求时发送事件移动到手头的下一个任务,并且没有其他实例会干扰或受到这项工作的影响,那么您可以选择使用内存队列。您需要一个具有相同和类似设置的侦听器来接收您的事件。如果您希望其他可免费服务的实例来帮助处理其中一个事件,这实际上是不可扩展的。此外,如果出于任何原因此 JVM 在运行中死机,请求将进入并出错(同样适用于 #1)
3. JMS / kafka 如果这是一个大型应用程序,具有帮助不同任务的独立进程并且这些进程必须是异步的,那么请考虑使用持久队列或像 kafka 这样的流。
所有这些方法都是可行的,但您需要查看您的场景,然后应用其中一种。其中每一项都需要在弹性/基础设施维护方面产生成本。
使用 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();
}