当前位置: 首页 > 面试题库 >

如何在Java中实现基于线程的UDP服务器?

微生季
2023-03-14
问题内容

如何在Java中实现基于线程的UDP服务器?

基本上,我想要的是将多个客户端连接到服务器,并让每个客户端都有自己的线程。唯一的问题是,我不知道如何检查客户端是否尝试连接到服务器并为其生成新线程。

boolean listening = true;

System.out.println("Server started.");

while (listening)
    new ServerThread().start();

在这种情况下,服务器将生成新线程,直到内存用完为止。这是ServerThread的代码(我想这里需要一种机制,该机制可以停止ServerThread的创建,直到客户端尝试连接为止。

public ServerThread(String name) throws IOException 
{
    super(name);
    socket = new DatagramSocket();
}

所以Java编程之父请帮忙。


问题答案:

此设计在一定程度上取决于每个完整的UDP“对话”是否仅需要单个请求和立即响应,是单个请求还是带有重传的响应,或者是否需要为每个客户。

我编写的RADIUS服务器具有单个请求+重传模型,并为每个传入数据包生成了一个线程。

DatagramPacket接收到每个消息后,将其传递到新线程,然后该线程负责发送回响应。这是因为生成每个响应所涉及的计算和数据库访问可能会花费相对较长的时间,并且生成线程比使用某种其他机制来处理仍在处理旧数据包的新数据包要容易得多。

public class Server implements Runnable {
    public void run() {
        while (true) {
            DatagramPacket packet = socket.receive();
            new Thread(new Responder(socket, packet)).start();
        }
    }
}

public class Responder implements Runnable {

    Socket socket = null;
    DatagramPacket packet = null;

    public Responder(Socket socket, DatagramPacket packet) {
        this.socket = socket;
        this.packet = packet;
    }

    public void run() {
        byte[] data = makeResponse(); // code not shown
        DatagramPacket response = new DatagramPacket(data, data.length,
            packet.getAddress(), packet.getPort());
        socket.send(response);
    }
}


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

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

  • 问题内容: Node.js服务器适用于支持回调函数的基于事件的模型。但是我无法理解它比传统的基于线程的服务器(线程等待系统IO)有什么优势。在基于线程的模型的情况下,当线程需要等待IO时,它将被抢占,因此不会消耗CPU周期,因此不会增加等待时间。 Node.js如何改善等待时间? 问题答案: 线程是相对较重的对象,具有资源足迹,一直扩展到内核。当您将线程驻留在阻塞的系统调用中或互斥或条件变量上时,

  • 问题内容: 我实际上正在从事一个网站项目。我是Web服务的新手。我在面向对象的编程(java,c#,…)方面有4年的经验。我已经阅读了很多有关Web服务的文章,但是我的文档都没有告诉您如何使用所有技术来制作一个真正的Web服务项目。 我要做的是:1.使用Java映射到JPA的MySQL后端;2.使用Web服务来提供…的某些功能(JBoss,…有很多可能性,我不知道应该选择哪种方式)3.创建一个动态

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