outdoor users(6)

This commit is contained in:
Louis Farina 2021-02-14 21:39:42 +01:00
parent 7971f14ad5
commit 1edff06f81
2 changed files with 151 additions and 99 deletions

View file

@ -7,11 +7,13 @@ public class Message implements Serializable{
private String text;
private String author;
private Boolean redirected;
public Message(String in_author, String in_text)
public Message(String in_author, String in_text, Boolean in_redirected)
{
text = in_text;
author = in_author;
redirected = in_redirected;
}
public void setText(String new_text)
{
@ -29,5 +31,9 @@ public class Message implements Serializable{
{
return author;
}
public Boolean isRedirected()
{
return redirected;
}
}

View file

@ -19,15 +19,17 @@ class OutdoorListenerThread extends Thread {
JTextArea displayArea;
JTextArea knownUsersPanel;
List<User> known_users;
List<User> known_outdoor_users;
List<Socket> dest_sockets;
List<Socket> outdoor_dest_sockets;
int portNumber;
OutdoorListenerThread(User in_user, List<User> in_known_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets,
OutdoorListenerThread(User in_user, List<User> in_known_users, List<User> in_known_outdoor_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets,
JTextArea in_displayArea, JTextArea in_knownUsersPanel)
{
user = in_user;
known_users = in_known_users;
known_outdoor_users = in_known_outdoor_users;
dest_sockets = in_dest_sockets;
outdoor_dest_sockets = in_outdoor_dest_sockets;
displayArea = in_displayArea;
@ -39,10 +41,15 @@ class OutdoorListenerThread extends Thread {
boolean exit = false;
boolean accepted = true;
String notification;
String username;
String response = "";
byte[] buffer = new byte[100];
DatagramPacket notifPacket = new DatagramPacket(buffer, buffer.length);
DatagramSocket notifSocket;
byte[] notifBytes;
try
{
while(!exit)
@ -64,6 +71,11 @@ class OutdoorListenerThread extends Thread {
}
response = response.trim();
response += ";";
for(User u:known_outdoor_users)
{
response += u.getName() + " ";
}
response = response.trim();
for(Socket s:dest_sockets)
{
response += s.getInetAddress().getHostAddress() + " ";
@ -78,25 +90,22 @@ class OutdoorListenerThread extends Thread {
{
accepted = accepted && (!username.equals(a.getName()));
}
for(User a:known_outdoor_users)
{
accepted = accepted && (!username.equals(a.getName()));
}
if(accepted)
{
notification = "+" + username;
notifBytes = notification.getBytes();
notifSocket = new DatagramSocket();
notifPacket = new DatagramPacket(notifBytes, notifBytes.length, InetAddress.getByName("192.168.1.255"), 1234);
notifSocket.send(notifPacket);
portNumber++;
Socket s = (new ServerSocket(portNumber)).accept();
(new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true, false)).start();
(new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start();
outdoor_dest_sockets.add(s);
known_users.add(new User(username));
Collections.sort(known_users);
displayArea.append(username + " has joined the chat.\n");
displayArea.setCaretPosition(displayArea.getDocument().getLength());
knownUsersPanel.setText("");
knownUsersPanel.append("Online:\n");
for(User a:known_users)
{
knownUsersPanel.append(" " + a.getName() + " \n");
}
}
servSocket.close();
}
@ -111,30 +120,29 @@ class OutdoorListenerThread extends Thread {
}
}
class ReceiveThread extends Thread {
User user;
Socket socket;
JTextArea displayArea;
JTextArea knownUsersPanel;
Boolean isOutdoor;
Boolean self;
List<User> known_users;
List<User> known_outdoor_users;
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, List<Socket> in_outdoor_dest_sockets, Boolean in_isOutdoor, Boolean in_self)
ReceiveThread(User in_user, Socket in_socket, JTextArea in_displayArea, List<User> in_known_users, List<User> in_known_outdoor_users,
JTextArea in_knownUsersPanel, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets, Boolean in_isOutdoor)
{
user = in_user;
socket = in_socket;
displayArea = in_displayArea;
knownUsersPanel = in_knownUsersPanel;
known_users = in_known_users;
known_outdoor_users = in_known_outdoor_users;
dest_sockets = in_dest_sockets;
outdoor_dest_sockets = in_outdoor_dest_sockets;
isOutdoor = in_isOutdoor;
self = in_self;
}
public void run()
{
@ -152,7 +160,7 @@ class ReceiveThread extends Thread {
try
{
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(message);
out.writeObject(new Message(message.getAuthor(), message.getText(), true));
}
catch(IOException e){}
}
@ -162,14 +170,12 @@ class ReceiveThread extends Thread {
if(message.getText() != null)
{
displayArea.append(message.getAuthor() + " : " + message.getText() + "\n");
}
else
{
displayArea.append(message.getAuthor() + " has left the chat.\n");
for(int i = 0;i < known_users.size();i ++)
{
if (known_users.get(i).getName().equals(message.getAuthor()))
{
known_users.remove(i);
@ -177,13 +183,17 @@ class ReceiveThread extends Thread {
//System.out.println("Removing " + message.getAuthor());
}
}
knownUsersPanel.setText("");
knownUsersPanel.append("Online:\n");
for(User u:known_users)
for(int i = 0;i < known_outdoor_users.size();i ++)
{
knownUsersPanel.append(" " + u.getName() + " \n");
if (known_outdoor_users.get(i).getName().equals(message.getAuthor()))
{
known_outdoor_users.remove(i);
break;
//System.out.println("Removing " + message.getAuthor());
}
if(!self)
}
if(!message.isRedirected() && message.getAuthor() != user.getName())
{
socket.close();
if(!isOutdoor)
@ -192,19 +202,28 @@ class ReceiveThread extends Thread {
outdoor_dest_sockets.remove(socket);
}
knownUsersPanel.setText("");
knownUsersPanel.append("Indoor users:\n");
for(User a:known_users)
{
knownUsersPanel.append(" " + a.getName() + " \n");
}
knownUsersPanel.append("\nOutdoor users:\n");
for(User a:known_outdoor_users)
{
knownUsersPanel.append(" " + a.getName() + " \n");
}
}
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
if(!self)
if(message.getAuthor() != user.getName())
{
for(Socket s:outdoor_dest_sockets)
{
try
{
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(message);
out.writeObject(new Message(message.getAuthor(), message.getText(), true));
}
catch(IOException e){}
}
@ -224,11 +243,12 @@ class ConnectionListenerThread extends Thread {
JTextArea displayArea;
JTextArea knownUsersPanel;
List<User> known_users;
List<User> known_outdoor_users;
List<Socket> dest_sockets;
List<Socket> outdoor_dest_sockets;
int portNumber;
ConnectionListenerThread(User in_user, List<User> in_known_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets,
ConnectionListenerThread(User in_user, List<User> in_known_users, List<User> in_known_outdoor_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets,
JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber)
{
user = in_user;
@ -243,6 +263,7 @@ class ConnectionListenerThread extends Thread {
{
boolean exit = false;
boolean accepted = true;
boolean outdoor;
byte[] buffer = new byte[100];
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
DatagramPacket responsePacket;
@ -267,6 +288,14 @@ class ConnectionListenerThread extends Thread {
requestSocket.receive(request);
username = new String(request.getData(), 0, request.getLength());
if(username.charAt(0) == '+')
{
username = username.substring(1);
outdoor = true;
}
else
{
outdoor = false;
InetAddress clientAddress= request.getAddress();
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
@ -288,29 +317,46 @@ class ConnectionListenerThread extends Thread {
responseBytes = response.getBytes();
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337);
responseSocket.send(responsePacket);
}
accepted = true;
for(User a:known_users)
{
accepted = accepted && (!username.equals(a.getName()));
}
for(User a:known_outdoor_users)
{
accepted = accepted && (!username.equals(a.getName()));
}
if(accepted)
{
if(outdoor)
{
known_outdoor_users.add(new User(username));
Collections.sort(known_outdoor_users);
}
else
{
portNumber++;
Socket s = (new ServerSocket(portNumber)).accept();
(new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start();
(new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
dest_sockets.add(s);
known_users.add(new User(username));
Collections.sort(known_users);
}
displayArea.append(username + " has joined the chat.\n");
displayArea.setCaretPosition(displayArea.getDocument().getLength());
knownUsersPanel.setText("");
knownUsersPanel.append("Online:\n");
knownUsersPanel.append("Indoor users:\n");
for(User a:known_users)
{
knownUsersPanel.append(" " + a.getName() + " \n");
}
knownUsersPanel.append("\nOutdoor users:\n");
for(User a:known_outdoor_users)
{
knownUsersPanel.append(" " + a.getName() + " \n");
}
@ -349,6 +395,7 @@ class ListenerStartThread extends Thread {
public class NetworkClient {
private User user;
private List<User> known_users;
private List<User> known_outdoor_users;
private List<Socket> dest_sockets;
private List<Socket> outdoor_dest_sockets;
private JTextArea chatText;
@ -373,6 +420,7 @@ public class NetworkClient {
chatText = in_chatText;
knownUsersPanel = in_knownUsersPanel;
known_users = new ArrayList<User>();
known_outdoor_users = new ArrayList<User>();
dest_sockets = new ArrayList<Socket>();
outdoor_dest_sockets = new ArrayList<Socket>();
}
@ -456,7 +504,7 @@ public class NetworkClient {
{
Socket s = new Socket(a, portNumber);
dest_sockets.add(s);
(new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start();
(new ReceiveThread(user, s, chatText, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
}
Collections.sort(known_users);
connected = true;
@ -482,8 +530,8 @@ public class NetworkClient {
{
if(!outdoor)
{
(new ConnectionListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start();
(new OutdoorListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel)).start();
(new ConnectionListenerThread(user, known_users, known_outdoor_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start();
(new OutdoorListenerThread(user, known_users, known_outdoor_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel)).start();
try
{
@ -495,7 +543,7 @@ public class NetworkClient {
/*Attention, getLocalIP ne marche que sur un même réseau physique
* pour tester avec Hamachi, il faut hardcoder les IP
*/
(new ReceiveThread(user, s2, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, true)).start();
(new ReceiveThread(user, s2, chatText, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
}
catch(IOException e)
{
@ -508,7 +556,7 @@ public class NetworkClient {
{
Socket s = new Socket(destinationIP, portNumber);
dest_sockets.add(s);
(new ReceiveThread(user, s, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start();
(new ReceiveThread(user, s, chatText, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
}
catch(IOException e)
{
@ -538,23 +586,21 @@ public class NetworkClient {
{
for(Socket s:dest_sockets)
{
System.out.println("Indoor users:");
try
{
System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort());
//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));
out.writeObject(new Message(user.getName(), message, false));
}
catch(IOException e){}
}
System.out.println("Outdoor users:");
for(Socket s:outdoor_dest_sockets)
{
try
{
System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort());
//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));
out.writeObject(new Message(user.getName(), message, false));
}
catch(IOException e){}
}