Merge remote-tracking branch 'origin/master'
# Conflicts: # src/main/java/fr/insa/clavardator/users/UserList.java
This commit is contained in:
commit
3485adfe7e
5 changed files with 65 additions and 24 deletions
|
@ -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"
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue