如何创建带有套接字的简单java负载平衡器?
运行UDP服务器侦听多个端口,就这么简单如何创建带有套接字的简单java负载平衡器?,java,sockets,udp,Java,Sockets,Udp,运行UDP服务器侦听多个端口,就这么简单 ExecutorService executorService = Executors.newFixedThreadPool(2); executorService.execute(new UDPServer(9998)); executorService.execute(new UDPServer(9999)); // UDP server implementation try (DatagramSocket socket = new Datagram
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(new UDPServer(9998));
executorService.execute(new UDPServer(9999));
// UDP server implementation
try (DatagramSocket socket = new DatagramSocket(port)) {
System.out.println("Plain UDP server :" + this.port + " name :" + Thread.currentThread().getName());
int numberOfPacketsReceived = 0;
while (true) {
// todo check to stop the server
byte[] buffer = new byte[1024];
DatagramPacket incomingDatagramPacket = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(incomingDatagramPacket);
System.out.println(Thread.currentThread().getName() + ":" + numberOfPacketsReceived++);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
} catch (SocketException e) {
e.printStackTrace();
}
我们是否可以通过编程方式创建一个侦听端口的负载平衡器
9997并将数据包转发到端口9999/9998
我们甚至可以将在一个UDP套接字中接收的流量重定向到另一个UDP套接字吗
另一个套接字?您最好让工作线程从阻塞队列中获取数据,并让第三个线程只读取数据包并将其放入队列以计算值 您可以将数据包重定向到另一个套接字,但这会在同一程序中产生不必要的开销,并且会丢失数据包元数据 如果您希望使用负载平衡器,可以实现如下负载平衡器:
class C {
public static void main(final String... args) {
try (DatagramSocket socket = new DatagramSocket(9997);
DatagramSocket out = new DatagramSocket()) {
final InetSocketAddress[] sockets = {
new InetSocketAddress("localhost", 9998),
new InetSocketAddress("localhost", 9999)
};
int i = 0;
while (true) {
// todo check to stop the server
byte[] buffer = new byte[1024];
DatagramPacket incomingDatagramPacket = new DatagramPacket(buffer, buffer.length);
try {
socket.receive(incomingDatagramPacket);
incomingDatagramPacket.setSocketAddress(sockets[i++%2]);
out.send(incomingDatagramPacket);
} catch (IOException e) {
e.printStackTrace();
continue;
}
}
} catch (SocketException e) {
e.printStackTrace();
}
}
}
是什么阻止你尝试?在9997上启动一台服务器,然后每2个数据包发送一次到9999,而不是9998。不清楚OP是要单独运行平衡器和工作程序,还是在同一台机器上运行。对于单机来说,这是一个不错的答案。@forum.test17我建议您分析代码,并在单独的问题中分享结果,如果不清楚如何对其采取行动。负载平衡器通常用于在不同的机器之间分配流量,即。E当一台机器显然是不够的时候。@Vovanrock2002我将在这个线程中这样做,很快添加了一种实现所需行为的方法。你不需要三个套接字,你也不需要在这里重定向任何东西,只需将数据包发送回它们来自的同一个端口。