outdoor users(3)
This commit is contained in:
parent
40b5c02a7d
commit
9c77df53a8
2 changed files with 153 additions and 74 deletions
|
@ -79,7 +79,7 @@ public class ClientWindow implements ActionListener {
|
||||||
"Choose Username",
|
"Choose Username",
|
||||||
JOptionPane.PLAIN_MESSAGE);
|
JOptionPane.PLAIN_MESSAGE);
|
||||||
|
|
||||||
connected = network.connect(username, false, "192.168.1.255");
|
connected = network.connect(username, outdoor, destinationIP);
|
||||||
if(!connected && username != null)
|
if(!connected && username != null)
|
||||||
{
|
{
|
||||||
if(username.equals(""))
|
if(username.equals(""))
|
||||||
|
|
|
@ -14,6 +14,105 @@ import java.util.*;
|
||||||
import chat.User;
|
import chat.User;
|
||||||
import chat.Message;
|
import chat.Message;
|
||||||
|
|
||||||
|
class OutdoorListenerThread extends Thread {
|
||||||
|
User user;
|
||||||
|
JTextArea displayArea;
|
||||||
|
JTextArea knownUsersPanel;
|
||||||
|
List<User> known_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,
|
||||||
|
JTextArea in_displayArea, JTextArea in_knownUsersPanel)
|
||||||
|
{
|
||||||
|
user = in_user;
|
||||||
|
known_users = in_known_users;
|
||||||
|
dest_sockets = in_dest_sockets;
|
||||||
|
outdoor_dest_sockets = in_outdoor_dest_sockets;
|
||||||
|
displayArea = in_displayArea;
|
||||||
|
knownUsersPanel = in_knownUsersPanel;
|
||||||
|
portNumber = 2344;
|
||||||
|
}
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
boolean exit = false;
|
||||||
|
boolean accepted = true;
|
||||||
|
byte[] buffer = new byte[100];
|
||||||
|
|
||||||
|
|
||||||
|
String username;
|
||||||
|
String response = "";
|
||||||
|
|
||||||
|
byte[] responseBytes;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while(!exit)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.out.println("Waiting for connection request");
|
||||||
|
ServerSocket servSocket = new ServerSocket(1234);
|
||||||
|
Socket link = servSocket.accept();
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(link.getInputStream()));
|
||||||
|
PrintWriter out = new PrintWriter(link.getOutputStream(), true);
|
||||||
|
username = in.readLine();
|
||||||
|
System.out.println("Received a request from " + username + "@" + link.getRemoteSocketAddress().toString());
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
out.println(response);
|
||||||
|
|
||||||
|
accepted = true;
|
||||||
|
for(User a:known_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)).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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(SocketTimeoutException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class ReceiveThread extends Thread {
|
class ReceiveThread extends Thread {
|
||||||
User user;
|
User user;
|
||||||
Socket socket;
|
Socket socket;
|
||||||
|
@ -123,7 +222,6 @@ class ConnectionListenerThread extends Thread {
|
||||||
List<Socket> dest_sockets;
|
List<Socket> dest_sockets;
|
||||||
List<Socket> outdoor_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, List<Socket> in_outdoor_dest_sockets,
|
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)
|
JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber)
|
||||||
|
@ -135,7 +233,6 @@ class ConnectionListenerThread extends Thread {
|
||||||
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()
|
||||||
{
|
{
|
||||||
|
@ -148,8 +245,6 @@ class ConnectionListenerThread extends Thread {
|
||||||
DatagramSocket requestSocket;
|
DatagramSocket requestSocket;
|
||||||
DatagramSocket responseSocket;
|
DatagramSocket responseSocket;
|
||||||
|
|
||||||
String requestStrings[];
|
|
||||||
String outdoorFlag;
|
|
||||||
String username;
|
String username;
|
||||||
String response = "";
|
String response = "";
|
||||||
|
|
||||||
|
@ -165,21 +260,17 @@ class ConnectionListenerThread extends Thread {
|
||||||
{
|
{
|
||||||
System.out.println("Waiting for connection request");
|
System.out.println("Waiting for connection request");
|
||||||
requestSocket.receive(request);
|
requestSocket.receive(request);
|
||||||
requestStrings = (new String(request.getData(), 0, request.getLength())).split(" ");
|
username = new String(request.getData(), 0, request.getLength());
|
||||||
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)
|
||||||
{
|
{
|
||||||
|
@ -187,9 +278,6 @@ 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();
|
||||||
|
@ -202,21 +290,12 @@ 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, outdoor_dest_sockets, false)).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));
|
||||||
|
|
||||||
|
@ -303,8 +382,6 @@ public class NetworkClient {
|
||||||
DatagramPacket connectionRequest;
|
DatagramPacket connectionRequest;
|
||||||
DatagramPacket responsePacket;
|
DatagramPacket responsePacket;
|
||||||
|
|
||||||
String requestString;
|
|
||||||
|
|
||||||
String[] usernameList;
|
String[] usernameList;
|
||||||
String[] addressList;
|
String[] addressList;
|
||||||
|
|
||||||
|
@ -315,26 +392,23 @@ public class NetworkClient {
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if(!outdoor)
|
||||||
{
|
{
|
||||||
connectionSocket = new DatagramSocket();
|
connectionSocket = new DatagramSocket();
|
||||||
userListSocket = new DatagramSocket(1337);
|
userListSocket = new DatagramSocket(1337);
|
||||||
|
|
||||||
userListSocket.setSoTimeout(500);
|
userListSocket.setSoTimeout(500);
|
||||||
|
|
||||||
if(outdoor)
|
connectionRequest = new DatagramPacket(username.getBytes(), username.length(),
|
||||||
requestString = username + " o";
|
|
||||||
else
|
|
||||||
requestString = username + " i";
|
|
||||||
|
|
||||||
connectionRequest = new DatagramPacket(requestString.getBytes(), requestString.length(),
|
|
||||||
InetAddress.getByName(destinationIP), 1234);
|
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");
|
||||||
connectionSocket.send(connectionRequest);
|
connectionSocket.send(connectionRequest);
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
responsePacket = new DatagramPacket(buffer1, buffer1.length);
|
responsePacket = new DatagramPacket(buffer1, buffer1.length);
|
||||||
|
|
||||||
System.out.println("Waiting for reply");
|
System.out.println("Waiting for reply");
|
||||||
|
@ -344,18 +418,25 @@ public class NetworkClient {
|
||||||
String[] response = new String(responsePacket.getData()).trim().split(";");
|
String[] response = new String(responsePacket.getData()).trim().split(";");
|
||||||
|
|
||||||
usernameList = response[0].split(" ");
|
usernameList = response[0].split(" ");
|
||||||
if(!outdoor)
|
|
||||||
{
|
|
||||||
addressList = response[1].split(" ");
|
addressList = response[1].split(" ");
|
||||||
System.out.println (response[2].length());
|
|
||||||
portNumber = Integer.parseInt(response[2]);
|
portNumber = Integer.parseInt(response[2]);
|
||||||
}
|
|
||||||
else
|
connectionSocket.close();
|
||||||
{
|
userListSocket.close();
|
||||||
addressList = new String[0];
|
|
||||||
portNumber = Integer.parseInt(response[1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Socket requestSocket = new Socket(destinationIP, 1234);
|
||||||
|
BufferedReader in = new BufferedReader(new InputStreamReader(requestSocket.getInputStream()));
|
||||||
|
PrintWriter out = new PrintWriter(requestSocket.getOutputStream(), true);
|
||||||
|
out.println(username);
|
||||||
|
String[] response = in.readLine().split(";");
|
||||||
|
usernameList = response[0].split(" ");
|
||||||
|
addressList = new String[0];
|
||||||
|
portNumber = Integer.parseInt(response[2]);
|
||||||
|
requestSocket.close();
|
||||||
|
}
|
||||||
|
|
||||||
for(String u:usernameList)
|
for(String u:usernameList)
|
||||||
{
|
{
|
||||||
|
@ -384,9 +465,6 @@ public class NetworkClient {
|
||||||
System.out.println("Reply timed out");
|
System.out.println("Reply timed out");
|
||||||
connected = true;
|
connected = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
connectionSocket.close();
|
|
||||||
userListSocket.close();
|
|
||||||
}
|
}
|
||||||
catch (SocketException e2)
|
catch (SocketException e2)
|
||||||
{
|
{
|
||||||
|
@ -402,6 +480,7 @@ public class NetworkClient {
|
||||||
if(!outdoor)
|
if(!outdoor)
|
||||||
{
|
{
|
||||||
(new ConnectionListenerThread(user, known_users, dest_sockets, outdoor_dest_sockets, chatText, knownUsersPanel, portNumber)).start();
|
(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();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue