ajout des outdoor users(1)

This commit is contained in:
Louis Farina 2021-02-13 19:43:54 +01:00
parent 3db828cc7a
commit 1348dc96ed
2 changed files with 198 additions and 50 deletions

View file

@ -29,8 +29,12 @@ public class ClientWindow implements ActionListener {
ClientWindow() ClientWindow()
{ {
boolean connected = false; Boolean connected = false;
Boolean outdoor = false;
Boolean exit = false;
String username = ""; String username = "";
String destinationIP = "";
chatWindow = new JFrame("Système de clavardage 2.0.1"); chatWindow = new JFrame("Système de clavardage 2.0.1");
chatPanel = new JPanel(new BorderLayout(2, 2)); chatPanel = new JPanel(new BorderLayout(2, 2));
@ -44,14 +48,38 @@ public class ClientWindow implements ActionListener {
network = new NetworkClient(chatText, knownUsersPanel); network = new NetworkClient(chatText, knownUsersPanel);
while(!connected && username != null) while(!connected && !exit)
{
Object[] options = {"Connect as indoor user", "Connect as outdoor user"};
int n = JOptionPane.showOptionDialog(chatWindow, "", "Choose Login Method", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, options, options[0]);
if(n == JOptionPane.YES_OPTION)
{
outdoor = false;
destinationIP = "192.168.1.255";
}
else if (n == JOptionPane.NO_OPTION)
{
outdoor = true;
destinationIP = JOptionPane.showInputDialog(chatWindow,
"Enter the server's IP address",
"Enter Server Address",
JOptionPane.PLAIN_MESSAGE);
}
else
{
exit = true;
}
if((!outdoor || (destinationIP != null)) && !exit)
{ {
username = JOptionPane.showInputDialog(chatWindow, username = JOptionPane.showInputDialog(chatWindow,
"Enter a username", "Enter a username",
"Login", "Choose Username",
JOptionPane.PLAIN_MESSAGE); JOptionPane.PLAIN_MESSAGE);
connected = network.connect(username); connected = network.connect(username, false, "192.168.1.255");
if(!connected && username != null) if(!connected && username != null)
{ {
if(username.equals("")) if(username.equals(""))
@ -60,8 +88,9 @@ public class ClientWindow implements ActionListener {
JOptionPane.showMessageDialog(chatWindow, "This username is already taken", "Error", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(chatWindow, "This username is already taken", "Error", JOptionPane.ERROR_MESSAGE);
} }
} }
}
if(username != null) if(username != null && !exit)
{ {
sendButton.addActionListener(this); sendButton.addActionListener(this);
messageField.addActionListener(this); messageField.addActionListener(this);

View file

@ -15,7 +15,25 @@ import chat.User;
import chat.Message; import chat.Message;
/*class OutdoorUserListenerThread extends Thread { /*class OutdoorUserListenerThread extends Thread {
OutdoorUserListenerThread()
{
}
public void run()
{
byte[] buffer = new byte[100];
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
DatagramSocket requestSocket;
try
{
requestSocket = new DatagramSocket(1233);
requestSocket.receive(request)
}
catch(Exception e)
{
e.printStackTrace();
}
}
}*/ }*/
class ReceiveThread extends Thread { class ReceiveThread extends Thread {
@ -23,10 +41,13 @@ class ReceiveThread extends Thread {
Socket socket; Socket socket;
JTextArea displayArea; JTextArea displayArea;
JTextArea knownUsersPanel; JTextArea knownUsersPanel;
Boolean isOutdoor;
List<User> known_users; List<User> known_users;
List<Socket> dest_sockets; List<Socket> dest_sockets;
List<Socket> outdoor_dest_sockets;
ReceiveThread(User in_user, Socket in_socket, JTextArea in_displayArea, List<User> in_known_users, JTextArea in_knownUsersPanel, List<Socket> in_dest_sockets) ReceiveThread(User in_user, Socket in_socket, JTextArea in_displayArea, List<User> in_known_users, JTextArea in_knownUsersPanel,
List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets, Boolean in_isOutdoor)
{ {
user = in_user; user = in_user;
socket = in_socket; socket = in_socket;
@ -34,6 +55,8 @@ class ReceiveThread extends Thread {
knownUsersPanel = in_knownUsersPanel; knownUsersPanel = in_knownUsersPanel;
known_users = in_known_users; known_users = in_known_users;
dest_sockets = in_dest_sockets; dest_sockets = in_dest_sockets;
outdoor_dest_sockets = in_outdoor_dest_sockets;
isOutdoor = in_isOutdoor;
} }
public void run() public void run()
{ {
@ -47,6 +70,7 @@ class ReceiveThread extends Thread {
if(message.getText() != null) if(message.getText() != null)
{ {
displayArea.append(message.getAuthor() + " : " + message.getText() + "\n"); displayArea.append(message.getAuthor() + " : " + message.getText() + "\n");
} }
else else
{ {
@ -70,11 +94,37 @@ class ReceiveThread extends Thread {
if(!message.getAuthor().equals(user.getName())) if(!message.getAuthor().equals(user.getName()))
{ {
socket.close(); socket.close();
if(!isOutdoor)
dest_sockets.remove(socket); dest_sockets.remove(socket);
else
outdoor_dest_sockets.remove(socket);
} }
exit = true; exit = true;
} }
displayArea.setCaretPosition(displayArea.getDocument().getLength()); displayArea.setCaretPosition(displayArea.getDocument().getLength());
if(isOutdoor)
{
for(Socket s:dest_sockets)
{
try
{
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(message);
}
catch(IOException e){}
}
}
for(Socket s:outdoor_dest_sockets)
{
try
{
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(message);
}
catch(IOException e){}
}
} }
@ -93,16 +143,21 @@ class ConnectionListenerThread extends Thread {
JTextArea knownUsersPanel; JTextArea knownUsersPanel;
List<User> known_users; List<User> known_users;
List<Socket> dest_sockets; List<Socket> dest_sockets;
List<Socket> outdoor_dest_sockets;
int portNumber; int portNumber;
int outdoorPortNumber;
ConnectionListenerThread(User in_user, List<User> in_known_users, List<Socket> in_dest_sockets, JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber) ConnectionListenerThread(User in_user, List<User> in_known_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets,
JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber)
{ {
user = in_user; user = in_user;
known_users = in_known_users; known_users = in_known_users;
dest_sockets = in_dest_sockets; dest_sockets = in_dest_sockets;
outdoor_dest_sockets = in_dest_sockets;
displayArea = in_displayArea; displayArea = in_displayArea;
knownUsersPanel = in_knownUsersPanel; knownUsersPanel = in_knownUsersPanel;
portNumber = in_portNumber; portNumber = in_portNumber;
outdoorPortNumber = 2344;
} }
public void run() public void run()
{ {
@ -115,6 +170,8 @@ class ConnectionListenerThread extends Thread {
DatagramSocket requestSocket; DatagramSocket requestSocket;
DatagramSocket responseSocket; DatagramSocket responseSocket;
String requestStrings[];
String outdoorFlag;
String username; String username;
String response = ""; String response = "";
@ -130,16 +187,21 @@ class ConnectionListenerThread extends Thread {
{ {
System.out.println("Waiting for connection request"); System.out.println("Waiting for connection request");
requestSocket.receive(request); requestSocket.receive(request);
username = new String(request.getData(), 0, request.getLength()); requestStrings = (new String(request.getData(), 0, request.getLength())).split(" ");
username = requestStrings[0];
outdoorFlag = requestStrings[1];
InetAddress clientAddress= request.getAddress(); InetAddress clientAddress= request.getAddress();
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress()); System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
response = ""; response = "";
for(User u:known_users) for(User u:known_users)
{ {
response += u.getName() + " "; response += u.getName() + " ";
} }
response = response.trim(); response = response.trim();
if(outdoorFlag.equals("i"))
{
response += ";"; response += ";";
for(Socket s:dest_sockets) for(Socket s:dest_sockets)
{ {
@ -147,6 +209,9 @@ class ConnectionListenerThread extends Thread {
} }
response = response.trim(); response = response.trim();
response += ";" + (portNumber+1); response += ";" + (portNumber+1);
}
else
response += ";" + (outdoorPortNumber+1);
System.out.println("Response :" + response); System.out.println("Response :" + response);
responseBytes = response.getBytes(); responseBytes = response.getBytes();
@ -159,11 +224,21 @@ class ConnectionListenerThread extends Thread {
accepted = accepted && (!username.equals(a.getName())); accepted = accepted && (!username.equals(a.getName()));
} }
if(accepted) if(accepted)
{
if(outdoorFlag.equals("i"))
{ {
portNumber++; portNumber++;
Socket s = (new ServerSocket(portNumber)).accept(); Socket s = (new ServerSocket(portNumber)).accept();
(new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets)).start(); (new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
dest_sockets.add(s); dest_sockets.add(s);
}
else
{
outdoorPortNumber++;
Socket s = (new ServerSocket(outdoorPortNumber)).accept();
(new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start();
dest_sockets.add(s);
}
known_users.add(new User(username)); known_users.add(new User(username));
@ -213,6 +288,7 @@ public class NetworkClient {
private User user; private User user;
private List<User> known_users; private List<User> known_users;
private List<Socket> dest_sockets; private List<Socket> dest_sockets;
private List<Socket> outdoor_dest_sockets;
private JTextArea chatText; private JTextArea chatText;
private JTextArea knownUsersPanel; private JTextArea knownUsersPanel;
@ -236,9 +312,10 @@ public class NetworkClient {
knownUsersPanel = in_knownUsersPanel; knownUsersPanel = in_knownUsersPanel;
known_users = new ArrayList<User>(); known_users = new ArrayList<User>();
dest_sockets = new ArrayList<Socket>(); dest_sockets = new ArrayList<Socket>();
outdoor_dest_sockets = new ArrayList<Socket>();
} }
boolean connect(String username) boolean connect(String username, Boolean outdoor, String destinationIP)
{ {
boolean nameAvailable = true; boolean nameAvailable = true;
boolean connected = false; boolean connected = false;
@ -248,6 +325,11 @@ public class NetworkClient {
DatagramPacket connectionRequest; DatagramPacket connectionRequest;
DatagramPacket responsePacket; DatagramPacket responsePacket;
String requestString;
String[] usernameList;
String[] addressList;
int portNumber = 1237; int portNumber = 1237;
byte[] buffer1 = new byte[20000]; byte[] buffer1 = new byte[20000];
@ -261,8 +343,13 @@ public class NetworkClient {
userListSocket.setSoTimeout(500); userListSocket.setSoTimeout(500);
connectionRequest = new DatagramPacket(username.getBytes(), username.length(), if(outdoor)
InetAddress.getByName("192.168.1.255"), 1234); requestString = username + " o";
else
requestString = username + " i";
connectionRequest = new DatagramPacket(requestString.getBytes(), requestString.length(),
InetAddress.getByName(destinationIP), 1234);
/*l'adresse de broadcast est hardcodée ici /*l'adresse de broadcast est hardcodée ici
pour tester avec Hamachi, il faut la remplacer par celle du réseau local virtuel*/ pour tester avec Hamachi, il faut la remplacer par celle du réseau local virtuel*/
System.out.println("Sending connection request"); System.out.println("Sending connection request");
@ -278,10 +365,18 @@ public class NetworkClient {
String[] response = new String(responsePacket.getData()).trim().split(";"); String[] response = new String(responsePacket.getData()).trim().split(";");
String[] usernameList = response[0].split(" "); usernameList = response[0].split(" ");
String[] addressList = response[1].split(" "); if(!outdoor)
{
addressList = response[1].split(" ");
System.out.println (response[2].length()); System.out.println (response[2].length());
portNumber = Integer.parseInt(response[2]); portNumber = Integer.parseInt(response[2]);
}
else
{
addressList = new String[0];
portNumber = Integer.parseInt(response[1]);
}
for(String u:usernameList) for(String u:usernameList)
@ -299,7 +394,7 @@ public class NetworkClient {
{ {
Socket s = new Socket(a, portNumber); Socket s = new Socket(a, portNumber);
dest_sockets.add(s); dest_sockets.add(s);
(new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets)).start(); (new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
} }
Collections.sort(known_users); Collections.sort(known_users);
connected = true; connected = true;
@ -326,8 +421,9 @@ public class NetworkClient {
if(connected) if(connected)
{ {
if(!outdoor)
(new ConnectionListenerThread(user, known_users, dest_sockets, chatText, knownUsersPanel, portNumber)).start(); {
(new ConnectionListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start();
try try
{ {
@ -339,12 +435,25 @@ public class NetworkClient {
/*Attention, getLocalIP ne marche que sur un même réseau physique /*Attention, getLocalIP ne marche que sur un même réseau physique
* pour tester avec Hamachi, il faut hardcoder les IP * pour tester avec Hamachi, il faut hardcoder les IP
*/ */
(new ReceiveThread(user, s2, chatText, known_users, knownUsersPanel, dest_sockets)).start(); (new ReceiveThread(user, s2, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
} }
catch(IOException e) catch(IOException e)
{ {
e.printStackTrace(); e.printStackTrace();
} }
}
else
{
try
{
Socket s = new Socket("0.0.0.0", portNumber);
dest_sockets.add(s);
}
catch(IOException e)
{
e.printStackTrace();
}
}
user.setName(username); user.setName(username);
known_users.add(new User(username)); known_users.add(new User(username));
@ -376,6 +485,16 @@ public class NetworkClient {
} }
catch(IOException e){} catch(IOException e){}
} }
for(Socket s:outdoor_dest_sockets)
{
try
{
System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort());
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(new Message(user.getName(), message));
}
catch(IOException e){}
}
} }
void disconnect() void disconnect()