Как я могу заставить мой поток Receiver уведомлять и пробуждать мой класс сокета? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть 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();
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...