ajout des outdoor users(1)
This commit is contained in:
parent
3db828cc7a
commit
1348dc96ed
2 changed files with 198 additions and 50 deletions
|
@ -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);
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue