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()
|
||||
{
|
||||
boolean connected = false;
|
||||
Boolean connected = false;
|
||||
Boolean outdoor = false;
|
||||
Boolean exit = false;
|
||||
String username = "";
|
||||
String destinationIP = "";
|
||||
|
||||
|
||||
chatWindow = new JFrame("Système de clavardage 2.0.1");
|
||||
chatPanel = new JPanel(new BorderLayout(2, 2));
|
||||
|
@ -44,14 +48,38 @@ public class ClientWindow implements ActionListener {
|
|||
|
||||
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,
|
||||
"Enter a username",
|
||||
"Login",
|
||||
"Choose Username",
|
||||
JOptionPane.PLAIN_MESSAGE);
|
||||
|
||||
connected = network.connect(username);
|
||||
connected = network.connect(username, false, "192.168.1.255");
|
||||
if(!connected && username != null)
|
||||
{
|
||||
if(username.equals(""))
|
||||
|
@ -60,8 +88,9 @@ public class ClientWindow implements ActionListener {
|
|||
JOptionPane.showMessageDialog(chatWindow, "This username is already taken", "Error", JOptionPane.ERROR_MESSAGE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(username != null)
|
||||
if(username != null && !exit)
|
||||
{
|
||||
sendButton.addActionListener(this);
|
||||
messageField.addActionListener(this);
|
||||
|
|
|
@ -15,7 +15,25 @@ import chat.User;
|
|||
import chat.Message;
|
||||
|
||||
/*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 {
|
||||
|
@ -23,10 +41,13 @@ class ReceiveThread extends Thread {
|
|||
Socket socket;
|
||||
JTextArea displayArea;
|
||||
JTextArea knownUsersPanel;
|
||||
Boolean isOutdoor;
|
||||
List<User> known_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)
|
||||
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;
|
||||
socket = in_socket;
|
||||
|
@ -34,6 +55,8 @@ class ReceiveThread extends Thread {
|
|||
knownUsersPanel = in_knownUsersPanel;
|
||||
known_users = in_known_users;
|
||||
dest_sockets = in_dest_sockets;
|
||||
outdoor_dest_sockets = in_outdoor_dest_sockets;
|
||||
isOutdoor = in_isOutdoor;
|
||||
}
|
||||
public void run()
|
||||
{
|
||||
|
@ -47,6 +70,7 @@ class ReceiveThread extends Thread {
|
|||
if(message.getText() != null)
|
||||
{
|
||||
displayArea.append(message.getAuthor() + " : " + message.getText() + "\n");
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -70,11 +94,37 @@ class ReceiveThread extends Thread {
|
|||
if(!message.getAuthor().equals(user.getName()))
|
||||
{
|
||||
socket.close();
|
||||
if(!isOutdoor)
|
||||
dest_sockets.remove(socket);
|
||||
else
|
||||
outdoor_dest_sockets.remove(socket);
|
||||
}
|
||||
exit = true;
|
||||
}
|
||||
|
||||
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;
|
||||
List<User> known_users;
|
||||
List<Socket> dest_sockets;
|
||||
List<Socket> outdoor_dest_sockets;
|
||||
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;
|
||||
known_users = in_known_users;
|
||||
dest_sockets = in_dest_sockets;
|
||||
outdoor_dest_sockets = in_dest_sockets;
|
||||
displayArea = in_displayArea;
|
||||
knownUsersPanel = in_knownUsersPanel;
|
||||
portNumber = in_portNumber;
|
||||
outdoorPortNumber = 2344;
|
||||
}
|
||||
public void run()
|
||||
{
|
||||
|
@ -115,6 +170,8 @@ class ConnectionListenerThread extends Thread {
|
|||
DatagramSocket requestSocket;
|
||||
DatagramSocket responseSocket;
|
||||
|
||||
String requestStrings[];
|
||||
String outdoorFlag;
|
||||
String username;
|
||||
String response = "";
|
||||
|
||||
|
@ -130,16 +187,21 @@ class ConnectionListenerThread extends Thread {
|
|||
{
|
||||
System.out.println("Waiting for connection 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();
|
||||
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
|
||||
|
||||
|
||||
response = "";
|
||||
for(User u:known_users)
|
||||
{
|
||||
response += u.getName() + " ";
|
||||
}
|
||||
response = response.trim();
|
||||
if(outdoorFlag.equals("i"))
|
||||
{
|
||||
response += ";";
|
||||
for(Socket s:dest_sockets)
|
||||
{
|
||||
|
@ -147,6 +209,9 @@ class ConnectionListenerThread extends Thread {
|
|||
}
|
||||
response = response.trim();
|
||||
response += ";" + (portNumber+1);
|
||||
}
|
||||
else
|
||||
response += ";" + (outdoorPortNumber+1);
|
||||
|
||||
System.out.println("Response :" + response);
|
||||
responseBytes = response.getBytes();
|
||||
|
@ -159,11 +224,21 @@ class ConnectionListenerThread extends Thread {
|
|||
accepted = accepted && (!username.equals(a.getName()));
|
||||
}
|
||||
if(accepted)
|
||||
{
|
||||
if(outdoorFlag.equals("i"))
|
||||
{
|
||||
portNumber++;
|
||||
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);
|
||||
}
|
||||
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));
|
||||
|
||||
|
@ -213,6 +288,7 @@ public class NetworkClient {
|
|||
private User user;
|
||||
private List<User> known_users;
|
||||
private List<Socket> dest_sockets;
|
||||
private List<Socket> outdoor_dest_sockets;
|
||||
private JTextArea chatText;
|
||||
private JTextArea knownUsersPanel;
|
||||
|
||||
|
@ -236,9 +312,10 @@ public class NetworkClient {
|
|||
knownUsersPanel = in_knownUsersPanel;
|
||||
known_users = new ArrayList<User>();
|
||||
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 connected = false;
|
||||
|
@ -248,6 +325,11 @@ public class NetworkClient {
|
|||
DatagramPacket connectionRequest;
|
||||
DatagramPacket responsePacket;
|
||||
|
||||
String requestString;
|
||||
|
||||
String[] usernameList;
|
||||
String[] addressList;
|
||||
|
||||
int portNumber = 1237;
|
||||
byte[] buffer1 = new byte[20000];
|
||||
|
||||
|
@ -261,8 +343,13 @@ public class NetworkClient {
|
|||
|
||||
userListSocket.setSoTimeout(500);
|
||||
|
||||
connectionRequest = new DatagramPacket(username.getBytes(), username.length(),
|
||||
InetAddress.getByName("192.168.1.255"), 1234);
|
||||
if(outdoor)
|
||||
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
|
||||
pour tester avec Hamachi, il faut la remplacer par celle du réseau local virtuel*/
|
||||
System.out.println("Sending connection request");
|
||||
|
@ -278,10 +365,18 @@ public class NetworkClient {
|
|||
|
||||
String[] response = new String(responsePacket.getData()).trim().split(";");
|
||||
|
||||
String[] usernameList = response[0].split(" ");
|
||||
String[] addressList = response[1].split(" ");
|
||||
usernameList = response[0].split(" ");
|
||||
if(!outdoor)
|
||||
{
|
||||
addressList = response[1].split(" ");
|
||||
System.out.println (response[2].length());
|
||||
portNumber = Integer.parseInt(response[2]);
|
||||
}
|
||||
else
|
||||
{
|
||||
addressList = new String[0];
|
||||
portNumber = Integer.parseInt(response[1]);
|
||||
}
|
||||
|
||||
|
||||
for(String u:usernameList)
|
||||
|
@ -299,7 +394,7 @@ public class NetworkClient {
|
|||
{
|
||||
Socket s = new Socket(a, portNumber);
|
||||
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);
|
||||
connected = true;
|
||||
|
@ -326,8 +421,9 @@ public class NetworkClient {
|
|||
|
||||
if(connected)
|
||||
{
|
||||
|
||||
(new ConnectionListenerThread(user, known_users, dest_sockets, chatText, knownUsersPanel, portNumber)).start();
|
||||
if(!outdoor)
|
||||
{
|
||||
(new ConnectionListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start();
|
||||
|
||||
try
|
||||
{
|
||||
|
@ -339,12 +435,25 @@ 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)).start();
|
||||
(new ReceiveThread(user, s2, chatText, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
|
||||
}
|
||||
catch(IOException e)
|
||||
{
|
||||
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);
|
||||
known_users.add(new User(username));
|
||||
|
@ -376,6 +485,16 @@ public class NetworkClient {
|
|||
}
|
||||
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()
|
||||
|
|
Loading…
Reference in a new issue