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",
JOptionPane.PLAIN_MESSAGE);
connected = network.connect(username, false, "192.168.1.255");
connected = network.connect(username, outdoor, destinationIP);
if(!connected && username != null)
{
if(username.equals(""))

View file

@ -14,6 +14,105 @@ import java.util.*;
import chat.User;
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 {
User user;
Socket socket;
@ -123,7 +222,6 @@ class ConnectionListenerThread extends Thread {
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, List<Socket> in_outdoor_dest_sockets,
JTextArea in_displayArea, JTextArea in_knownUsersPanel, int in_portNumber)
@ -135,7 +233,6 @@ class ConnectionListenerThread extends Thread {
displayArea = in_displayArea;
knownUsersPanel = in_knownUsersPanel;
portNumber = in_portNumber;
outdoorPortNumber = 2344;
}
public void run()
{
@ -148,8 +245,6 @@ class ConnectionListenerThread extends Thread {
DatagramSocket requestSocket;
DatagramSocket responseSocket;
String requestStrings[];
String outdoorFlag;
String username;
String response = "";
@ -165,21 +260,17 @@ class ConnectionListenerThread extends Thread {
{
System.out.println("Waiting for connection request");
requestSocket.receive(request);
requestStrings = (new String(request.getData(), 0, request.getLength())).split(" ");
username = requestStrings[0];
outdoorFlag = requestStrings[1];
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)
{
response += u.getName() + " ";
}
response = response.trim();
if(outdoorFlag.equals("i"))
{
response += ";";
for(Socket s:dest_sockets)
{
@ -187,9 +278,6 @@ class ConnectionListenerThread extends Thread {
}
response = response.trim();
response += ";" + (portNumber+1);
}
else
response += ";" + (outdoorPortNumber+1);
System.out.println("Response :" + response);
responseBytes = response.getBytes();
@ -202,21 +290,12 @@ 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, 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));
@ -303,8 +382,6 @@ public class NetworkClient {
DatagramPacket connectionRequest;
DatagramPacket responsePacket;
String requestString;
String[] usernameList;
String[] addressList;
@ -315,26 +392,23 @@ public class NetworkClient {
return false;
try
{
try
{
if(!outdoor)
{
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(),
connectionRequest = new DatagramPacket(username.getBytes(), username.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
{
responsePacket = new DatagramPacket(buffer1, buffer1.length);
System.out.println("Waiting for reply");
@ -344,18 +418,25 @@ public class NetworkClient {
String[] response = new String(responsePacket.getData()).trim().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]);
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)
{
@ -384,9 +465,6 @@ public class NetworkClient {
System.out.println("Reply timed out");
connected = true;
}
connectionSocket.close();
userListSocket.close();
}
catch (SocketException e2)
{
@ -402,6 +480,7 @@ 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();
try
{