merge broadcast

This commit is contained in:
Auriane Lartigue 2020-12-04 15:43:05 +01:00
commit 8d70aa09e7
8 changed files with 126 additions and 62 deletions

View file

@ -1,9 +1,14 @@
import java.io.IOException;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.InterfaceAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Enumeration;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -14,35 +19,36 @@ import java.util.concurrent.Executors;
*/
public class ChatApp {
/* Liste des utilisateurs actifs */
private ListUtilisateurs actifUsers ;
private static ArrayList<Integer> ListPort = new ArrayList<Integer>();
private Map<String,Historique> mapHistorique ;
public static ArrayList<Integer> getListPort() {
return ListPort;
}
/* ChatApp est associé à un utilisateur */
private Utilisateur me;
/**
* Constructeur de l'application de chat
*
*
* @param pseudo Pseudo de l'utilisateur
* @param port Port de communication
* @param port Port de communication
*/
public ChatApp(String pseudo, Integer port){
this.actifUsers = new ListUtilisateurs() ;
// Recuperer adresse IP de l'utilisateur
// Recuperer adresse IP de l'utilisateur
InetAddress ip = null ;
try {
//ip = InetAddress.getByName("192.168.1.72");
ip = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
e.printStackTrace();
@ -52,69 +58,72 @@ public class ChatApp {
this.actifUsers.addList(getMe());
this.mapHistorique = new HashMap<String,Historique>() ;
}
public void majHistorique(String pseudo,Historique h) {
getMapHistorique().put(h.getUser2().getPseudo(),h);
}
/**
* Modification du pseudo de l'utilisateur
* Modification du pseudo de l'utilisateur
* Envoie en broadcast son ancien pseudo et son nouveau
*
*
* @param nouveau correspond au nouveau pseudo
*/
public void modifierPseudo(String nouveau) throws IOException {
// @ de broadcast du réseau de l'utilisateur me
InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER
// @ de broadcast du réseau de l'utilisateur me
InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER
// Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Modification Pseudo\n" + this.getMe().getPseudo() + "\n" + nouveau + "\n";
for(Integer p : ListPort ) {
/*for(Integer p : ListPort ) {
if(!(p.equals(this.getMe().getPort())))
{
UDPEchange.connexion(broadcastAdress,broadcastMessage, p);
}
}
}*/
UDPEchange.connexion(broadcastAdress,broadcastMessage, 1024);
}
/**
* Methode appelée lors de la connexion d'un nouvel utilisateur.
* Methode appelée lors de la connexion d'un nouvel utilisateur.
* Il va prévenir les utilisateurs du réseau de son arrivée.
*
*
*/
public void connexion() throws IOException {
// @ de broadcast du réseau de l'utilisateur me
InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER
// @ de broadcast du réseau de l'utilisateur me
InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER
// Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Connexion\n" + this.getMe().toString() ;
for(Integer p : ListPort ) {
if(!(p.equals(this.getMe().getPort())))
{
UDPEchange.connexion(broadcastAdress,broadcastMessage, p);
}
/*for(Integer p : ListPort ) {
if(!(p.equals(this.getMe().getPort())))
{
UDPEchange.connexion(broadcastAdress,broadcastMessage, p);
}
}*/
UDPEchange.connexion(broadcastAdress,broadcastMessage, 1024);
}
/**
* Methode appelée lors de la déconnexion de l'utilisateur.
* Methode appelée lors de la déconnexion de l'utilisateur.
* Il va prévenir les utilisateurs du réseau de son départ.
*
*
*/
public void deconnexion() throws IOException {
// @ de broadcast du réseau de l'utilisateur me
InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER
// @ de broadcast du réseau de l'utilisateur me
InetAddress broadcastAdress = InetAddress.getLoopbackAddress(); // A MODIFIER
// Message que l'on envoie à tous les utilisateurs actifs
String broadcastMessage = "Deconnexion\n" + this.getMe().toString() ;
for(Integer p : ListPort ) {
if( !(p.equals(this.getMe().getPort())))
{
UDPEchange.connexion(broadcastAdress,broadcastMessage, p);
}
/*for(Integer p : ListPort ) {
if(!(p.equals(this.getMe().getPort())))
{
UDPEchange.connexion(broadcastAdress,broadcastMessage, p);
}
}*/
UDPEchange.connexion(broadcastAdress,broadcastMessage, 1024);
}
public static void main (String[] args) throws IOException {
//Integer p = 2345 ;
ChatApp app = new ChatApp(args[0],Integer.parseInt(args[1])) ;
@ -123,14 +132,21 @@ public class ChatApp {
ListPort.add(1234);
ListPort.add(3000);
ListPort.add(4000);
InetAddress localHost = InetAddress.getLocalHost();
System.out.println("Mon adresse:" + localHost.toString());
/*for(InetAddress broadcastAddr : UDPEchange.listAllBroadcastAddresses()) {
System.out.println("Broadcast sent with address " + broadcastAddr.toString());
}*/
//InetAddress broadcastAddress = InterfaceAddress.getBroadcast();
//System.out.println("Mon adresse:" + localHost.toString());
ExecutorService exec = Executors.newFixedThreadPool(1000);
exec.submit(new Runner(app));
exec.submit(new Runner(app));
try {
app.connexion();
} catch (IOException e) {
e.printStackTrace();
}
if (app.getMe().getPort() == 4000) {
try {
Thread.sleep(2000);
@ -163,7 +179,7 @@ public class ChatApp {
public Map<String,Historique> getMapHistorique() {
return mapHistorique;
}
public Historique getHist(String pseudo) {
Historique h = this.mapHistorique.get(pseudo);
if( h != null) {
@ -174,19 +190,21 @@ public class ChatApp {
return h ;
}
}
}
class Runner implements Runnable {
ChatApp app ;
ChatApp app ;
public Runner(ChatApp app) {
this.app = app ;
}
@Override
public void run() {
UDPEchange.ecouteUDP(app);
}
}

View file

@ -1,5 +1,3 @@
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@ -36,6 +34,7 @@ public class MessageHorodate {
* @return Les differents attributs de la classe sous forme de string
* </p>
*/
@Override
public String toString() {
String Msg = "";
Msg += ("Destinataire: " + this.destinataire + "\n") ;

Binary file not shown.

View file

@ -1,5 +1,4 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

Binary file not shown.

View file

@ -2,7 +2,12 @@ import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
@ -26,12 +31,24 @@ public class UDPEchange {
*/
public static void connexion( InetAddress broadcastAdress , String broadcastMessage , Integer port) throws IOException {
// Envoie en broadcast à tous les utilsateurs
DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(true);
byte[]buffer = broadcastMessage.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length, InetAddress.getLoopbackAddress(), port );
socket.send(packet);
socket.close();
for (InetAddress broadcastAddr : listAllBroadcastAddresses()) {
DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(true);
byte[]buffer = broadcastMessage.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length, broadcastAddr, port );
socket.send(packet);
socket.close();
System.out.println("Broadcast sent with address " + broadcastAddr.toString());
}
/*
DatagramSocket socket = new DatagramSocket();
socket.setBroadcast(true);
byte[]buffer = broadcastMessage.getBytes();
DatagramPacket packet = new DatagramPacket( buffer, buffer.length, broadcastAdress, port );
socket.send(packet);
socket.close();
*/
System.out.println("***********Message envoye***********");
System.out.println("Dest Ip: " + broadcastAdress.toString());
System.out.println("Dest port: " + port.toString());
@ -89,8 +106,31 @@ public class UDPEchange {
System.out.println(broadcastMessage);
System.out.println("************************************");
}
static List<InetAddress> listAllBroadcastAddresses() throws SocketException {
List<InetAddress> broadcastList = new ArrayList<>();
Enumeration<NetworkInterface> interfaces
= NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface networkInterface = interfaces.nextElement();
if (networkInterface.isLoopback() || !networkInterface.isUp()) {
continue;
}
networkInterface.getInterfaceAddresses().stream()
.map(a -> a.getBroadcast())
.filter(Objects::nonNull)
.forEach(broadcastList::add);
}
return broadcastList;
}
}
/**
* <p>
* Classe implémentant l'interface Runnable.
@ -241,4 +281,8 @@ class RunnerUDP implements Runnable {
( app.getActifUsers() ).supprimerList(Utilisateur.stringToUtilisateur(received.split("\n")[1]));
}
}
}

View file

@ -32,6 +32,7 @@ public class Utilisateur extends Object {
return ip;
}
@Override
public String toString(){
String s = "";
s+="pseudo " + this.pseudo + " | ";

View file

@ -0,0 +1,3 @@
public class View{
}