outdoor users(6)
This commit is contained in:
parent
7971f14ad5
commit
1edff06f81
2 changed files with 151 additions and 99 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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,39 +183,52 @@ 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(!self)
|
||||
{
|
||||
socket.close();
|
||||
if(!isOutdoor)
|
||||
dest_sockets.remove(socket);
|
||||
else
|
||||
outdoor_dest_sockets.remove(socket);
|
||||
if (known_outdoor_users.get(i).getName().equals(message.getAuthor()))
|
||||
{
|
||||
known_outdoor_users.remove(i);
|
||||
break;
|
||||
//System.out.println("Removing " + message.getAuthor());
|
||||
}
|
||||
}
|
||||
|
||||
if(!message.isRedirected() && message.getAuthor() != user.getName())
|
||||
{
|
||||
socket.close();
|
||||
if(!isOutdoor)
|
||||
dest_sockets.remove(socket);
|
||||
else
|
||||
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)
|
||||
{
|
||||
for(Socket s:outdoor_dest_sockets)
|
||||
{
|
||||
try
|
||||
{
|
||||
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||
out.writeObject(message);
|
||||
}
|
||||
catch(IOException e){}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(message.getAuthor() != user.getName())
|
||||
{
|
||||
for(Socket s:outdoor_dest_sockets)
|
||||
{
|
||||
try
|
||||
{
|
||||
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||
out.writeObject(new Message(message.getAuthor(), message.getText(), true));
|
||||
}
|
||||
catch(IOException e){}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(EOFException e) {}
|
||||
catch(Exception 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,50 +288,75 @@ class ConnectionListenerThread extends Thread {
|
|||
requestSocket.receive(request);
|
||||
username = new String(request.getData(), 0, request.getLength());
|
||||
|
||||
InetAddress clientAddress= request.getAddress();
|
||||
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
|
||||
|
||||
response = "";
|
||||
for(User u:known_users)
|
||||
if(username.charAt(0) == '+')
|
||||
{
|
||||
response += u.getName() + " ";
|
||||
username = username.substring(1);
|
||||
outdoor = true;
|
||||
}
|
||||
response = response.trim();
|
||||
response += ";";
|
||||
for(Socket s:dest_sockets)
|
||||
else
|
||||
{
|
||||
response += s.getInetAddress().getHostAddress() + " ";
|
||||
outdoor = false;
|
||||
InetAddress clientAddress= request.getAddress();
|
||||
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
|
||||
|
||||
response = "";
|
||||
for(User u:known_users)
|
||||
{
|
||||
response += u.getName() + " ";
|
||||
}
|
||||
response = response.trim();
|
||||
response += ";";
|
||||
for(Socket s:dest_sockets)
|
||||
{
|
||||
response += s.getInetAddress().getHostAddress() + " ";
|
||||
}
|
||||
response = response.trim();
|
||||
response += ";" + (portNumber+1);
|
||||
|
||||
System.out.println("Response :" + response);
|
||||
responseBytes = response.getBytes();
|
||||
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337);
|
||||
responseSocket.send(responsePacket);
|
||||
}
|
||||
response = response.trim();
|
||||
response += ";" + (portNumber+1);
|
||||
|
||||
System.out.println("Response :" + response);
|
||||
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)
|
||||
{
|
||||
portNumber++;
|
||||
Socket s = (new ServerSocket(portNumber)).accept();
|
||||
(new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false, false)).start();
|
||||
dest_sockets.add(s);
|
||||
|
||||
|
||||
known_users.add(new User(username));
|
||||
|
||||
Collections.sort(known_users);
|
||||
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, 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,26 +586,24 @@ 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());
|
||||
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||
out.writeObject(new Message(user.getName(), message));
|
||||
}
|
||||
catch(IOException e){}
|
||||
}
|
||||
{
|
||||
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, false));
|
||||
}
|
||||
catch(IOException e){}
|
||||
}
|
||||
}
|
||||
|
||||
void disconnect()
|
||||
|
|
Loading…
Reference in a new issue