当前位置: 首页 > 知识库问答 >
问题:

使用ThreadPool的多线程UDP服务器

齐文林
2023-03-14
 
    public void run() {

共有1个答案

璩涵衍
2023-03-14

您不需要自己的队列ExecutorService有一个任务队列。我还建议不要每次打开一个新的套接字,因为你可以重复使用它们。

结果代码可能大致如下所示。

public void run() {
    ExecutorService tpes = Executors.newFixedThreadPool(10);
    int server_port = 8767;
    DatagramSocket s = null;
    try {
        s = new DatagramSocket(server_port);
        while (true) {
            byte[] message = new byte[1024];
            DatagramPacket p = new DatagramPacket(message, message.length);
            try {
                s.receive(p);
                tpes.execute(new RequestHandler(p));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    } catch (SocketException e) {
        e.printStackTrace();
        System.out.println("Socket excep");
    } finally {
        if (s != null) s.close();
    }
}

RequestHandler将在10个线程中的一个线程上运行,如果收到的请求超过10个线程所能处理的请求,则在Executor中将有一个挂起的RequestHandler任务队列。

 类似资料:
  • 我是个新手,如果你能给我建议的话,请告诉我。我有一个向客户端广播消息的服务器。然后客户端将回复发送回服务器。我想用单独的线程处理每个回复。每个回复都有mesage id和thread id。我如何用来自所有线程的信息填充一些结构,然后读取它 也从我的代码,它是正确地创建线程,而还是它存在某种方式来创建线程,只是如果我得到客户端的回复? 我是从正确的理解开始的吗? 非常感谢。

  • 我有两个线程,一个在一个套接字上监听并添加到队列中,另一个从队列中减去并提交处理。第二个线程在队列为空时Hibernate。这个睡眠不知怎么会影响第一个线程,也就是说,如果您移除睡眠或使它变大,那么第一个线程的socket.receive中的延迟就会增加。如果我保持尽可能低的睡眠,它会变得更好,但不是完美的。我做错了什么?

  • 为了实现这一点,我使用了队列/线程池机制。最初,我创建一个固定数量线程的池,并有一个队列datastructure来存储客户机地址。这个队列在所有线程之间共享,因此我使用“互斥”来锁定/解锁这个队列。在主服务器线程中,我创建一个套接字,将其绑定到全局端口/地址,然后在“recvfrom”调用上阻止服务器。任何希望与服务器通信的客户端都会向侦听全局端口地址的主线程服务器发送“HI”消息。主服务器线程

  • 我正在尝试基于Netty构建一个UDP服务器,以便根据客户端订阅(在订阅设置之前交换一些UDP请求/响应消息)将事件(大约每秒500个事件)连续发布到不同的客户端。 设计是由Java执行器创建一些生产者/消费者线程。生成消息后,使用者线程将其写入UDP通道。 观察到,服务器端只有一个EventLoop线程在为该UDP通道工作,并且它非常忙于向套接字写入消息,因此对第二个和更高版本客户端的订阅请求的

  • 我试图使用Netty来设置一个简单的UDP服务器,遵循这里的示例,但使用Spring来连接依赖项。 我的Spring配置类: 为了避免阻塞主线程(用于Spring配置),我创建了一个新线程,如下所示: 我可以看到新线程被阻塞,等待通道关闭(如示例所示)。主线程可以继续Spring配置。然而,这仍然不起作用。

  • 然后是数据报通道、pipelineFactory和Bootstrap: 在pipelineFactory中,getPipeline()添加自定义处理程序。 就像中所说的:UDP消息的多线程处理 然后我根据这些条目修改了一些代码。现在创建线程池的条件是: 和ExecutionHandler的pipelineFactory: getPipeline()添加处理程序,如所描述的: 但它们不同时处理。me