outdoor users(3)

This commit is contained in:
Louis Farina 2021-02-13 23:13:28 +01:00
parent 40b5c02a7d
commit 9c77df53a8
2 changed files with 153 additions and 74 deletions

View file

@ -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(""))

View file

@ -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,31 +260,24 @@ 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 += ";";
for(Socket s:dest_sockets)
{ {
response += ";"; response += s.getInetAddress().getHostAddress() + " ";
for(Socket s:dest_sockets)
{
response += s.getInetAddress().getHostAddress() + " ";
}
response = response.trim();
response += ";" + (portNumber+1);
} }
else response = response.trim();
response += ";" + (outdoorPortNumber+1); response += ";" + (portNumber+1);
System.out.println("Response :" + response); System.out.println("Response :" + response);
responseBytes = response.getBytes(); responseBytes = response.getBytes();
@ -203,20 +291,11 @@ class ConnectionListenerThread extends Thread {
} }
if(accepted) if(accepted)
{ {
if(outdoorFlag.equals("i")) portNumber++;
{ Socket s = (new ServerSocket(portNumber)).accept();
portNumber++; (new ReceiveThread(user, s, displayArea, known_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
Socket s = (new ServerSocket(portNumber)).accept(); dest_sockets.add(s);
(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)); 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;
@ -316,46 +393,50 @@ public class NetworkClient {
try try
{ {
connectionSocket = new DatagramSocket();
userListSocket = new DatagramSocket(1337);
userListSocket.setSoTimeout(500);
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");
connectionSocket.send(connectionRequest);
try try
{ {
responsePacket = new DatagramPacket(buffer1, buffer1.length);
System.out.println("Waiting for reply");
userListSocket.receive(responsePacket);
System.out.println("Received a reply from " + responsePacket.getAddress().getHostAddress());
String[] response = new String(responsePacket.getData()).trim().split(";");
usernameList = response[0].split(" ");
if(!outdoor) if(!outdoor)
{ {
addressList = response[1].split(" "); connectionSocket = new DatagramSocket();
System.out.println (response[2].length()); userListSocket = new DatagramSocket(1337);
portNumber = Integer.parseInt(response[2]);
} userListSocket.setSoTimeout(500);
else
{ connectionRequest = new DatagramPacket(username.getBytes(), username.length(),
addressList = new String[0]; InetAddress.getByName(destinationIP), 1234);
portNumber = Integer.parseInt(response[1]); /*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");
connectionSocket.send(connectionRequest);
responsePacket = new DatagramPacket(buffer1, buffer1.length);
System.out.println("Waiting for reply");
userListSocket.receive(responsePacket);
System.out.println("Received a reply from " + responsePacket.getAddress().getHostAddress());
String[] response = new String(responsePacket.getData()).trim().split(";");
usernameList = response[0].split(" ");
addressList = response[1].split(" ");
portNumber = Integer.parseInt(response[2]);
connectionSocket.close();
userListSocket.close();
} }
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
{ {