Java Multicast Socket реализация "покинуть чат" - PullRequest
0 голосов
/ 17 марта 2019

У меня возникла проблема при реализации механизма выхода из чата.Дело в том, что когда один пользователь набирает close в консоли, чтобы выйти из группового чата, программа завершается и возвращает 0, но в то же время все остальные пользователи (программы, которые работают параллельно) «пинаются», я имею в видупрограммы других пользователей все еще работают, но они не отправляют сообщения.Простой socket.leaveGroup(group) не работает: (

Вот мой код, вы можете попробовать его, чтобы узнать, что происходит. Я был бы очень признателен за вашу помощь.

public class GroupChat {
    static volatile boolean finished = false;
    static String name;
    static ArrayList<String> groups;
    static String myRoom;

    GroupChat() {
        groups = new ArrayList<>();
        groups.add("Room 1:");
        groups.add("Room 2:");
        groups.add("Room 3:");
        groups.add("Room 4:");
    }

    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("Need IP address and port...");
        } else {

            try {
                Scanner sc = new Scanner(System.in);
                int getRoom;

                System.out.print("Enter group chat, press (1), (2), (3) or (4) ... ");
                getRoom = Integer.parseInt(sc.nextLine());
                System.out.print("Enter username: ");
                name = sc.nextLine();

                GroupChat GC = new GroupChat();
                myRoom = groups.get(getRoom - 1);

                InetAddress group = InetAddress.getByName(args[0]);
                int port = Integer.parseInt(args[1]);

                MulticastSocket socket = new MulticastSocket(port);
                socket.setTimeToLive(0);
                socket.joinGroup(group);

                Thread t = new Thread(new ReadThread(socket, group, port));
                t.start();

                String message = myRoom + " " + name + " has joined.";
                byte[] buffer = message.getBytes();
                DatagramPacket datagram = new
                        DatagramPacket(buffer, buffer.length, group, port);
                socket.send(datagram);

                System.out.println("Wpisz wiadomość ...\n");

                message = "";
                String closeThis = message;
                while (!closeThis.equals("close")) {
                    Scanner MyMessage = new Scanner(System.in);
                    message = MyMessage.nextLine();
                    closeThis = message;

                    message = myRoom + " " + name + ": " + message;
                    buffer = message.getBytes();
                    datagram = new
                            DatagramPacket(buffer, buffer.length, group, port);
                    socket.send(datagram);
                }

                message = myRoom + name + " has left.";
                buffer = message.getBytes();
                datagram = new
                        DatagramPacket(buffer, buffer.length, group, port);
                socket.send(datagram);

                socket.leaveGroup(group);
                socket.close();

            } catch (SocketException se) {
                System.out.println("Error creating socket");
                se.printStackTrace();
            } catch (IOException ie) {
                System.out.println("Error reading/writing from/to socket");
                ie.printStackTrace();
            }
        }
    }
}

.

class ReadThread implements Runnable {
    private MulticastSocket socket;
    private InetAddress group;
    private int port;
    private static final int MAX_LEN = 1000;

    ReadThread(MulticastSocket socket, InetAddress group, int port) {
        this.socket = socket;
        this.group = group;
        this.port = port;
    }

    @Override
    public void run() {
        String message = "";
        boolean close = false;
        while (!close) {
            byte[] buffer = new byte[ReadThread.MAX_LEN];
            DatagramPacket datagram = new
                    DatagramPacket(buffer, buffer.length, group, port);

            try {
                socket.receive(datagram);
                message = new String(buffer, 0, datagram.getLength(), "UTF-8");

                if(message.substring(message.length() - 5).equals("close")) {
                    close = true;
                }
                else {
                    if (message.startsWith(GroupChat.myRoom)) {
                        message = message.substring(8);
                        if (!message.startsWith(GroupChat.name)) {
                            System.out.println(message);
                        }
                    }
                }
            } catch (IOException e) {
                System.out.println("Socket closed!");
            }
        }
        System.out.println(GroupChat.name + " has left.");
    }
}
...