作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何在 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);
}
}
关于java - 如何在 Java 中实现基于线程 UDP 的服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773121/
我是一名优秀的程序员,十分优秀!