Compare commits

..

No commits in common. "9d55a5700e89061b9076ddc6c1b0d6ca6dcca8d3" and "38ee3f108cfc0dffc30a2b15ecd56a800282aacb" have entirely different histories.

5 changed files with 64 additions and 49 deletions

Binary file not shown.

View file

@ -62,36 +62,43 @@ public class ConnectionListenerThread extends Thread {
requestSocket.receive(request); requestSocket.receive(request);
username = new String(request.getData(), 0, request.getLength()); username = new String(request.getData(), 0, request.getLength());
if(username.charAt(0) == '+')
InetAddress clientAddress= request.getAddress();
System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
response = "";
for(User u:known_users)
{ {
response += u.getName() + " "; username = username.substring(1);
outdoor = true;
} }
response = response.trim(); else
response += ";";
for(User u:known_outdoor_users)
{ {
response += u.getName() + " "; outdoor = false;
} InetAddress clientAddress= request.getAddress();
response = response.trim(); System.out.println("Received a request from " + username + "@" + clientAddress.getHostAddress());
response += ";";
for(Socket s:dest_sockets)
{
response += s.getInetAddress().getHostAddress() + " ";
}
response = response.trim();
response += ";" + (portNumber+1); response = "";
for(User u:known_users)
{
response += u.getName() + " ";
}
response = response.trim();
response += ";";
for(User u:known_outdoor_users)
{
response += u.getName() + " ";
}
response = response.trim();
response += ";";
for(Socket s:dest_sockets)
{
response += s.getInetAddress().getHostAddress() + " ";
}
response = response.trim();
System.out.println("Response :" + response); response += ";" + (portNumber+1);
responseBytes = response.getBytes();
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337); System.out.println("Response :" + response);
responseSocket.send(responsePacket); responseBytes = response.getBytes();
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337);
responseSocket.send(responsePacket);
}
accepted = true; accepted = true;
for(User a:known_users) for(User a:known_users)
{ {
@ -103,10 +110,18 @@ public class ConnectionListenerThread extends Thread {
} }
if(accepted) if(accepted)
{ {
portNumber++; if(outdoor)
Socket s = (new ServerSocket(portNumber)).accept(); {
(new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start(); known_outdoor_users.add(new User(username));
dest_sockets.add(s); Collections.sort(known_outdoor_users);
}
else
{
portNumber++;
Socket s = (new ServerSocket(portNumber)).accept();
(new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, false)).start();
dest_sockets.add(s);
}
} }
} }
catch(SocketTimeoutException e) {} catch(SocketTimeoutException e) {}

View file

@ -203,23 +203,21 @@ public class NetworkClient {
void send (Notification notif) void send (Notification notif)
{ {
System.out.println("Indoor users:");
for(Socket s:dest_sockets) for(Socket s:dest_sockets)
{ {
try try
{ {
System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort()); //System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort());
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(notif); out.writeObject(notif);
} }
catch(IOException e){} catch(IOException e){}
} }
System.out.println("Outdoor users:");
for(Socket s:outdoor_dest_sockets) for(Socket s:outdoor_dest_sockets)
{ {
try try
{ {
System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort()); //System.out.println(s.getInetAddress().getHostAddress() + ": local port " + s.getLocalPort() + ", remote port " + s.getPort());
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(notif); out.writeObject(notif);
} }

View file

@ -21,7 +21,7 @@ class OutdoorListenerThread extends Thread {
List<User> known_outdoor_users; List<User> known_outdoor_users;
List<Socket> dest_sockets; List<Socket> dest_sockets;
List<Socket> outdoor_dest_sockets; List<Socket> outdoor_dest_sockets;
int outdoorPortNumber; int portNumber;
OutdoorListenerThread(User in_user, List<User> in_known_users, List<User> in_known_outdoor_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets, OutdoorListenerThread(User in_user, List<User> in_known_users, List<User> in_known_outdoor_users, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets,
JTextArea in_displayArea, JTextArea in_knownUsersPanel) JTextArea in_displayArea, JTextArea in_knownUsersPanel)
@ -33,16 +33,22 @@ OutdoorListenerThread(User in_user, List<User> in_known_users, List<User> in_kn
outdoor_dest_sockets = in_outdoor_dest_sockets; outdoor_dest_sockets = in_outdoor_dest_sockets;
displayArea = in_displayArea; displayArea = in_displayArea;
knownUsersPanel = in_knownUsersPanel; knownUsersPanel = in_knownUsersPanel;
outdoorPortNumber = 2344; portNumber = 2344;
} }
public void run() public void run()
{ {
boolean exit = false; boolean exit = false;
boolean accepted = true; boolean accepted = true;
String notification;
String username; String username;
String response = ""; String response = "";
byte[] buffer = new byte[100];
DatagramPacket notifPacket = new DatagramPacket(buffer, buffer.length);
DatagramSocket notifSocket;
byte[] notifBytes;
try try
{ {
while(!exit) while(!exit)
@ -69,7 +75,7 @@ OutdoorListenerThread(User in_user, List<User> in_known_users, List<User> in_kn
response += u.getName() + " "; response += u.getName() + " ";
} }
response = response.trim(); response = response.trim();
response += ";" + (outdoorPortNumber+1); response += ";" + (portNumber+1);
out.println(response); out.println(response);
@ -84,8 +90,14 @@ OutdoorListenerThread(User in_user, List<User> in_known_users, List<User> in_kn
} }
if(accepted) if(accepted)
{ {
outdoorPortNumber++; notification = "+" + username;
Socket s = (new ServerSocket(outdoorPortNumber)).accept(); notifBytes = notification.getBytes();
notifSocket = new DatagramSocket();
notifPacket = new DatagramPacket(notifBytes, notifBytes.length, InetAddress.getByName("192.168.1.255"), 1234);
notifSocket.send(notifPacket);
portNumber++;
Socket s = (new ServerSocket(portNumber)).accept();
(new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start(); (new ReceiveThread(user, s, displayArea, known_users, known_outdoor_users, knownUsersPanel, dest_sockets, outdoor_dest_sockets, true)).start();
outdoor_dest_sockets.add(s); outdoor_dest_sockets.add(s);
} }

View file

@ -1,7 +1,6 @@
package chat; package chat;
import java.io.EOFException; import java.io.EOFException;
import java.net.SocketException;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
@ -47,6 +46,7 @@ class ReceiveThread extends Thread {
if(!(notif.getAuthor().equals(user)) && !notif.isRedirected()) if(!(notif.getAuthor().equals(user)) && !notif.isRedirected())
{ {
System.out.println("Redirecting message");
for(Socket s:outdoor_dest_sockets) for(Socket s:outdoor_dest_sockets)
{ {
try try
@ -54,7 +54,6 @@ class ReceiveThread extends Thread {
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
notif.setRedirected(true); notif.setRedirected(true);
out.writeObject(notif); out.writeObject(notif);
notif.setRedirected(false);
} }
catch(IOException e){} catch(IOException e){}
} }
@ -91,8 +90,6 @@ class ReceiveThread extends Thread {
if(!dn.isRedirected() && !dn.getAuthor().equals(user)) if(!dn.isRedirected() && !dn.getAuthor().equals(user))
{ {
exit = true;
socket.close(); socket.close();
if(!isOutdoor) if(!isOutdoor)
dest_sockets.remove(socket); dest_sockets.remove(socket);
@ -139,13 +136,6 @@ class ReceiveThread extends Thread {
} }
} }
catch(EOFException e) {} catch(EOFException e) {}
catch(SocketException e)
{
if(!isOutdoor)
dest_sockets.remove(socket);
else
outdoor_dest_sockets.remove(socket);
}
catch(Exception e) catch(Exception e)
{ {
e.printStackTrace(); e.printStackTrace();