您在说什么有点困惑,或者可能需要更多信息。请记住,UDP 客户端不连接它们只是发送数据包,并且不能保证这些数据包按发送顺序到达。
我要做的只是让一个监听 UDP 套接字等待数据包。您应该通过其 IP 地址或任何其他方法维护有效客户端的列表,例如数据包数据中的 ID。收到数据包后,您可以使用处理客户端请求的函数/线程对其进行处理。正如我所看到的,您甚至不需要启动新线程,但这取决于服务器在收到数据包时要做什么以及处理它需要多长时间。另外,请记住处理请求的函数/线程不能从客户端(通过同一端口)接收更多数据包;所有传入的数据包都由服务器线程处理。处理客户端的函数或线程' s request 它所能做的只是向客户端发送一个或多个 UDP 数据包以确认请求,但它无法与客户端保持对话,也无法确定客户端是否已关闭,因为没有永久打开的连接。如果您需要服务器和客户端之间的对话,那么您需要更改为 TCP 套接字。
这是代码草稿:
ClientRequestThread(DatagramPacket packet)
{
String FromIP = packet.getAddress().getHostAddress();
byte[] data = packet.getData();
// Here you must identify the client, either by its IP address
// or maybe an ID inside the data.
if (TheDataHaveBeenProccessOK)
{
Send a positive acknowledge
}
else
{
Send a negative acknowledge
}
}
ServerThread()
{
DatagramSocket datagramSocket;
try
{
datagramSocket = new DatagramSocket(MyPortNumber);
}
catch (Exception e)
{
// Unable to open the datagram socket.
// Handle it accordingly
return;
}
byte[] buffer = new byte[256]; // change it to your needs
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (YouDontStopMe)
{
try
{
datagramSocket.receive(packet);
// Here you must either call a function or start a thread
// to handle the client request
// depends on what you are going to do with the client's request.
ClientRequestThread(packet);
}
catch (Exception e)
{
// Error reading the socket, handle it accordingly
e.printStackTrace();
}
}
datagramSocket.close();
}