Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何创建带有套接字的简单java负载平衡器?_Java_Sockets_Udp - Fatal编程技术网

如何创建带有套接字的简单java负载平衡器?

如何创建带有套接字的简单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

运行UDP服务器侦听多个端口,就这么简单

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我将在这个线程中这样做,很快添加了一种实现所需行为的方法。你不需要三个套接字,你也不需要在这里重定向任何东西,只需将数据包发送回它们来自的同一个端口。