У меня есть Multicast Socket, которому нужно отправить сообщение регистрации на сервер и дождаться подтверждения.Multicast Socket (ChatClient) создает экземпляр класса Receiver, который постоянно прослушивает входящие пакеты udp и обрабатывает их.(Выведите на экран, если они являются просто пакетами сообщений, подтвердите регистрацию, если они являются пакетами «подтвержденных регистрацией».)
В методе Register (String username) объект ChatClient ожидает сообщения в 3000 мс.Если время истекает (или если он получает пакет «отказано в регистрации»), регистрация отменяется, иначе класс Receiver будет немедленно уведомлен о том, что только что получил пакет «подтверждение подтверждено».
Проблема в том, что код всинхронизированный блок просто не запускается.(Ниже приведен небольшой тестовый код с 3 классами).
Как я могу позволить получателю уведомить основной поток и завершить ожидание ChatClient?
открытый класс ChatClient extends ChatHost {
InetAddress server_address;
int server_port;
int id;
boolean awaiting = false;
public ChatClient(InetAddress group_address, int group_port, InetAddress server_address, int server_port) throws IOException {
super(group_port, group_address);
this.server_address = server_address;
this.server_port = server_port;
}
public static void main(String[] args) throws IOException {
ChatClient test = new ChatClient(InetAddress.getByName("224.1.1.1"), 6667, InetAddress.getByName("localhost"), 6666);
test.Register("test");
new ChatClient(InetAddress.getByName("224.1.1.1"), 6667, InetAddress.getByName("localhost"),6666);
}
public void Register(String username) throws IOException {
ChatPacket message = new ChatPacket(ChatPacket.Type.REGISTRATION_REQUEST, username);
byte[] buffer = ChatPacket.serialize(message);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, server_address, server_port);
send(packet);
awaiting = true;
synchronized (this){
try {
wait(3000);
} catch (InterruptedException e) {
awaiting = false;
System.out.println("Notify works");
}
awaiting = false;
}
}
открытый абстрактный класс ChatHost extends MulticastSocket {
public InetAddress group_address;
protected Thread ReceiverThread;
public ChatHost(int port, InetAddress group) throws IOException {
super(port);
this.group_address = group;
ReceiverThread =
new Thread(new Receiver(this));
ReceiverThread.start();
}
public void sendMessage(String message_content, int id, InetAddress receiver_address, int receiver_port) throws IOException {
ChatPacket message = new ChatPacket(ChatPacket.Type.MESSAGE, id, message_content);
byte[] buffer = ChatPacket.serialize(message);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, receiver_address, receiver_port);
send(packet);
System.out.println(buffer.length); //TEST
}
public abstract void messageReceived(DatagramPacket packet);
Открытый класс Receiver реализует Runnable
{
ChatHost host = null;
static public boolean ack = false;
public Receiver(ChatHost host){
this.host = host;
}
@Override
public void run() {
while (true) {
byte[] buf = new byte[1000];
DatagramPacket received_packet = new DatagramPacket(buf, buf.length);
try {
host.receive(received_packet);
} catch (IOException e) {
e.printStackTrace();
}
synchronized (host){
if(awaiting){
host.notifyAll();
}