很抱歉没有尽快更新。该问题已修复如下:
我需要将DatagramSocket存储到每个线程。侦听套接字还应该是用于继续服务器与客户端之间的通信的套接字。这是更新代码的位。
线程上的新套接字注册代码:
public void setCommSocket(DatagramPacket pkt, int port, DatagramSocket skt){ comm_ip = pkt.getAddress(); comm_port = pkt.getPort(); synchronized(comm_pkt) { comm_pkt = pkt; } comm_skt = skt;}新服务器侦听代码:
public void UDPListen() { while(true) { synchronized(stop) { if(stop) break; } byte[] recieve_data = new byte[64]; DatagramPacket rpkt = new DatagramPacket(recieve_data, recieve_data.length); try { datagram_server_socket.receive(rpkt); int port = 0; byte[] rdata = rpkt.getData(); port += rdata[0]<<24; port += rdata[1]<<16; port += rdata[2]<<8; port += (0xFF)&rdata[3]; byte[] tid = new byte[rdata.length]; for(int i = 4; i < rdata.length && rdata[i] > 0; i++) { tid[i-4] = rdata[i]; } String thread_id = new String(tid).trim(); for(int i = 0; i < threads.size(); i++) { ClientThread t = threads.get(i); if(t.getThreadId().compareTo(thread_id) == 0) { t.setCommSocket(rpkt, port, datagram_server_socket); } else { System.err.println("THREAD ID " + thread_id + " COULD NOT BE FOUND"); } } } catch (IOException e) { if(!(e instanceof SocketException) && !(e instanceof SocketTimeoutException)) log.warning("Error while listening for an UDP Packet."); } finally { for(int i = 0; i < threads.size(); i++) { ClientThread t = threads.get(i); t.sendKeepAlive(); } } } }我将省略服务器/线程结构的一些更新。这里的重要部分是接收到数据包的套接字被重新用于将数据发送回客户端。此外,实际的数据包被重新用于发送数据:
public void sendIdle() { if(comm_ip != null) { synchronized(comm_pkt) { try { comm_pkt.setData(new byte[]{1, ProtocolWrapper.IDLE}); comm_skt.send(comm_pkt); } catch (Exception e) { e.printStackTrace(); } } } }这是我的包装器类的相关部分,显示了每个线程持有的内容:
public class PeerWrapper { private InetAddress ipaddress; private Integer port; private Socket client_socket; private InetAddress comm_ip; private DatagramSocket comm_skt; private DatagramPacket comm_pkt; private int comm_port; private byte status;


