Merge remote-tracking branch 'origin/master'

# Conflicts:
#	src/main/java/fr/insa/clavardator/users/UserList.java
This commit is contained in:
Arnaud Vergnet 2020-12-02 10:57:49 +01:00
commit 3485adfe7e
5 changed files with 65 additions and 24 deletions

View file

@ -17,6 +17,7 @@ javafx {
} }
dependencies { dependencies {
implementation 'org.jetbrains:annotations:20.1.0'
runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:win" runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:win"
runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:linux" runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:linux"
runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:mac" runtimeOnly "org.openjfx:javafx-graphics:$javafx.version:mac"

View file

@ -1,6 +1,8 @@
package fr.insa.clavardator; package fr.insa.clavardator;
import fr.insa.clavardator.network.NetDiscoverer;
import fr.insa.clavardator.ui.MainController; import fr.insa.clavardator.ui.MainController;
import fr.insa.clavardator.util.ErrorHandler;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Parent; import javafx.scene.Parent;
@ -32,6 +34,19 @@ public class MainApp extends Application {
stage.setMinWidth(800); stage.setMinWidth(800);
stage.setMaximized(true); stage.setMaximized(true);
stage.show(); stage.show();
// Network discovery test
ErrorHandler.getInstance().addObserver(evt -> ((Exception)evt.getNewValue()).printStackTrace());
NetDiscoverer.discoverActiveUsers("Broadcast",
(ipAddr, data) -> System.out.println("User detected at address : " + ipAddr.toString())
);
NetDiscoverer.startDiscoveryListening("Yohan", null);
} }
@Override
public void stop() throws Exception {
NetDiscoverer.stopDiscovery();
super.stop();
}
} }

View file

@ -1,6 +1,7 @@
package fr.insa.clavardator.network; package fr.insa.clavardator.network;
import fr.insa.clavardator.util.ErrorHandler; import fr.insa.clavardator.util.ErrorHandler;
import org.jetbrains.annotations.Nullable;
import java.io.IOException; import java.io.IOException;
import java.net.*; import java.net.*;
@ -12,8 +13,12 @@ import java.util.Objects;
public class NetDiscoverer { public class NetDiscoverer {
private static final short DISCOVERY_PORT = 31593; private static final short DISCOVERY_PORT = 31593;
private static final short RESPONSE_PORT = 31594; private static final short RESPONSE_PORT = 31594;
public static final int BROADCAST_BUFFER_SIZE = 50; private static final int BROADCAST_BUFFER_SIZE = 50;
public static final int RESPONSE_BUFFER_SIZE = 50; private static final int RESPONSE_BUFFER_SIZE = 50;
private static DatagramSocket broadcastListener;
private static DatagramSocket responseListener;
private static boolean shouldStop = false;
private NetDiscoverer() { private NetDiscoverer() {
} }
@ -23,9 +28,9 @@ public class NetDiscoverer {
* *
* @param callback function to call when a new user is discovered * @param callback function to call when a new user is discovered
*/ */
public static void discoverActiveUsers(ResponseReceivedCallback callback) { public static void discoverActiveUsers(String broadcastMessage, ResponseReceivedCallback callback) {
ResponseListener receiver = new ResponseListener(callback); ResponseListener receiver = new ResponseListener(callback);
BroadcastSender sender = new BroadcastSender("USER_DISCOVERY_BROADCAST"); BroadcastSender sender = new BroadcastSender(broadcastMessage);
receiver.start(); receiver.start();
sender.start(); sender.start();
} }
@ -33,13 +38,24 @@ public class NetDiscoverer {
/** /**
* Starts to listen for discovery broadcasts and answers them * Starts to listen for discovery broadcasts and answers them
*/ */
public static void startDiscoveryListening() { public static void startDiscoveryListening(String responseMessage, @Nullable BroadcastReceivedCallback onBroadcastReceived) {
BroadcastListener listener = new BroadcastListener( BroadcastListener listener = new BroadcastListener((ipAddr, data) -> {
(ipAddr, data) -> new ResponseSender(ipAddr, "USER_DISCOVERY_RESPONSE").start() if (onBroadcastReceived != null)
onBroadcastReceived.onBroadcastReceived(ipAddr, data);
new ResponseSender(ipAddr, responseMessage).start();
}
); );
listener.start(); listener.start();
} }
public static void stopDiscovery() {
shouldStop = true;
if (broadcastListener != null)
broadcastListener.close();
if (responseListener != null)
responseListener.close();
}
private static class BroadcastSender extends Thread { private static class BroadcastSender extends Thread {
String broadcastMessage; String broadcastMessage;
@ -79,26 +95,27 @@ public class NetDiscoverer {
@Override @Override
public void run() { public void run() {
while (true) { // TODO: add a stop condition while (!shouldStop) {
try { try {
DatagramSocket listener = new DatagramSocket(null); broadcastListener = new DatagramSocket(null);
listener.setOption(StandardSocketOptions.SO_REUSEPORT, true); broadcastListener.setOption(StandardSocketOptions.SO_REUSEPORT, true);
listener.setOption(StandardSocketOptions.SO_REUSEADDR, true); broadcastListener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
listener.bind(new InetSocketAddress((InetAddress) null, DISCOVERY_PORT)); broadcastListener.bind(new InetSocketAddress((InetAddress) null, DISCOVERY_PORT));
byte[] buffer = new byte[BROADCAST_BUFFER_SIZE]; byte[] buffer = new byte[BROADCAST_BUFFER_SIZE];
DatagramPacket receivedPacket = new DatagramPacket(buffer, BROADCAST_BUFFER_SIZE); DatagramPacket receivedPacket = new DatagramPacket(buffer, BROADCAST_BUFFER_SIZE);
listener.receive(receivedPacket); broadcastListener.receive(receivedPacket);
// System.out.println("broadcast received from " + receivedPacket.getAddress().toString()); // System.out.println("broadcast received from " + receivedPacket.getAddress().toString());
callback.onBroadcastReceived(receivedPacket.getAddress(), new String(receivedPacket.getData())); callback.onBroadcastReceived(receivedPacket.getAddress(), new String(receivedPacket.getData()));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); if (!shouldStop) {
ErrorHandler.getInstance().notifyError(e); ErrorHandler.getInstance().notifyError(e);
} }
} }
} }
} }
}
private static class ResponseSender extends Thread { private static class ResponseSender extends Thread {
String message; String message;
@ -136,24 +153,26 @@ public class NetDiscoverer {
@Override @Override
public void run() { public void run() {
while (true) { // TODO: add a stop condition while (!shouldStop) {
try { try {
DatagramSocket listener = new DatagramSocket(null); responseListener = new DatagramSocket(null);
listener.setOption(StandardSocketOptions.SO_REUSEPORT, true); responseListener.setOption(StandardSocketOptions.SO_REUSEPORT, true);
listener.setOption(StandardSocketOptions.SO_REUSEADDR, true); responseListener.setOption(StandardSocketOptions.SO_REUSEADDR, true);
listener.bind(new InetSocketAddress((InetAddress) null, RESPONSE_PORT)); responseListener.bind(new InetSocketAddress((InetAddress) null, RESPONSE_PORT));
byte[] buffer = new byte[RESPONSE_BUFFER_SIZE]; byte[] buffer = new byte[RESPONSE_BUFFER_SIZE];
DatagramPacket receivedPacket = new DatagramPacket(buffer, RESPONSE_BUFFER_SIZE); DatagramPacket receivedPacket = new DatagramPacket(buffer, RESPONSE_BUFFER_SIZE);
listener.receive(receivedPacket); responseListener.receive(receivedPacket);
// System.out.println("response received from " + receivedPacket.getAddress().toString()); // System.out.println("response received from " + receivedPacket.getAddress().toString());
callback.onResponseReceived(receivedPacket.getAddress(), new String(receivedPacket.getData())); callback.onResponseReceived(receivedPacket.getAddress(), new String(receivedPacket.getData()));
} catch (IOException e) { } catch (IOException e) {
if (!shouldStop) {
ErrorHandler.getInstance().notifyError(e); ErrorHandler.getInstance().notifyError(e);
} }
} }
} }
} }
}
static List<InetAddress> listAllBroadcastAddresses() throws SocketException { static List<InetAddress> listAllBroadcastAddresses() throws SocketException {

View file

@ -1,10 +1,12 @@
package fr.insa.clavardator.users; package fr.insa.clavardator.users;
import org.jetbrains.annotations.NotNull;
import java.beans.PropertyChangeListener; import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport; import java.beans.PropertyChangeSupport;
import java.io.Serializable; import java.io.Serializable;
public class User implements Serializable { public class User implements Serializable, Comparable<User> {
protected String username; protected String username;
// Make this class observable // Make this class observable
@ -28,4 +30,8 @@ public class User implements Serializable {
} }
@Override
public int compareTo(@NotNull User o) {
return username.compareTo(o.username);
}
} }

View file

@ -48,7 +48,7 @@ public class UserList {
* *
*/ */
public void discoverActiveUsers() { public void discoverActiveUsers() {
NetDiscoverer.discoverActiveUsers((ipAddr, data) -> { NetDiscoverer.discoverActiveUsers("CLAVARDATOR_BROADCAST", (ipAddr, data) -> {
ActiveUser newUser = new ActiveUser("", ipAddr); // TODO find username ActiveUser newUser = new ActiveUser("", ipAddr); // TODO find username
activeUsers.add(newUser); activeUsers.add(newUser);
pcs.firePropertyChange("activeUsers", null, newUser); pcs.firePropertyChange("activeUsers", null, newUser);