У меня возникла проблема при реализации механизма выхода из чата.Дело в том, что когда один пользователь набирает 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.");
}
}