outdoor users(12)
This commit is contained in:
parent
fbad70314a
commit
972671ee8f
10 changed files with 499 additions and 426 deletions
|
|
@ -134,10 +134,10 @@ public class ClientWindow implements ActionListener {
|
||||||
|
|
||||||
public void actionPerformed(ActionEvent event) {
|
public void actionPerformed(ActionEvent event) {
|
||||||
String message = messageField.getText();
|
String message = messageField.getText();
|
||||||
if(message.compareTo("") != 0)
|
if("".compareTo(message) != 0)
|
||||||
{
|
{
|
||||||
messageField.setText("");
|
messageField.setText("");
|
||||||
network.send(message);
|
network.send(new Message(network.getUser(), message, false));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
16
src/chat/ConnectNotification.java
Normal file
16
src/chat/ConnectNotification.java
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
public class ConnectNotification extends Notification {
|
||||||
|
private Boolean outdoor;
|
||||||
|
ConnectNotification (User in_author, Boolean in_redirected, Boolean in_outdoor)
|
||||||
|
{
|
||||||
|
author = in_author;
|
||||||
|
redirected = in_redirected;
|
||||||
|
outdoor = in_outdoor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean isOutdoor()
|
||||||
|
{
|
||||||
|
return outdoor;
|
||||||
|
}
|
||||||
|
}
|
||||||
136
src/chat/ConnectionListenerThread.java
Normal file
136
src/chat/ConnectionListenerThread.java
Normal file
|
|
@ -0,0 +1,136 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
import java.net.DatagramPacket;
|
||||||
|
import java.net.DatagramSocket;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.JTextArea;
|
||||||
|
|
||||||
|
public class ConnectionListenerThread extends Thread {
|
||||||
|
User user;
|
||||||
|
JTextArea displayArea;
|
||||||
|
JTextArea knownUsersPanel;
|
||||||
|
List<User> known_users;
|
||||||
|
List<User> known_outdoor_users;
|
||||||
|
List<Socket> dest_sockets;
|
||||||
|
List<Socket> outdoor_dest_sockets;
|
||||||
|
int portNumber;
|
||||||
|
|
||||||
|
ConnectionListenerThread(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, int in_portNumber)
|
||||||
|
{
|
||||||
|
user = in_user;
|
||||||
|
known_users = in_known_users;
|
||||||
|
known_outdoor_users = in_known_outdoor_users;
|
||||||
|
dest_sockets = in_dest_sockets;
|
||||||
|
outdoor_dest_sockets = in_outdoor_dest_sockets;
|
||||||
|
displayArea = in_displayArea;
|
||||||
|
knownUsersPanel = in_knownUsersPanel;
|
||||||
|
portNumber = in_portNumber;
|
||||||
|
}
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
boolean exit = false;
|
||||||
|
boolean accepted = true;
|
||||||
|
boolean outdoor;
|
||||||
|
byte[] buffer = new byte[100];
|
||||||
|
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
|
||||||
|
DatagramPacket responsePacket;
|
||||||
|
|
||||||
|
DatagramSocket requestSocket;
|
||||||
|
DatagramSocket responseSocket;
|
||||||
|
|
||||||
|
String username;
|
||||||
|
String response = "";
|
||||||
|
|
||||||
|
byte[] responseBytes;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
requestSocket = new DatagramSocket(1234);
|
||||||
|
responseSocket = new DatagramSocket();
|
||||||
|
|
||||||
|
while(!exit)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
System.out.println("Waiting for connection request");
|
||||||
|
requestSocket.receive(request);
|
||||||
|
username = new String(request.getData(), 0, request.getLength());
|
||||||
|
|
||||||
|
if(username.charAt(0) == '+')
|
||||||
|
{
|
||||||
|
username = username.substring(1);
|
||||||
|
outdoor = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
outdoor = false;
|
||||||
|
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();
|
||||||
|
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();
|
||||||
|
|
||||||
|
response += ";" + (portNumber+1);
|
||||||
|
|
||||||
|
System.out.println("Response :" + response);
|
||||||
|
responseBytes = response.getBytes();
|
||||||
|
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337);
|
||||||
|
responseSocket.send(responsePacket);
|
||||||
|
}
|
||||||
|
accepted = true;
|
||||||
|
for(User a:known_users)
|
||||||
|
{
|
||||||
|
accepted = accepted && (!username.equals(a.getName()));
|
||||||
|
}
|
||||||
|
for(User a:known_outdoor_users)
|
||||||
|
{
|
||||||
|
accepted = accepted && (!username.equals(a.getName()));
|
||||||
|
}
|
||||||
|
if(accepted)
|
||||||
|
{
|
||||||
|
if(outdoor)
|
||||||
|
{
|
||||||
|
known_outdoor_users.add(new User(username));
|
||||||
|
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(Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
src/chat/DisconnectNotification.java
Normal file
9
src/chat/DisconnectNotification.java
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
public class DisconnectNotification extends Notification {
|
||||||
|
DisconnectNotification (User in_author, Boolean in_redirected)
|
||||||
|
{
|
||||||
|
author = in_author;
|
||||||
|
redirected = in_redirected;
|
||||||
|
}
|
||||||
|
}
|
||||||
25
src/chat/ListenerStartThread.java
Normal file
25
src/chat/ListenerStartThread.java
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ListenerStartThread extends Thread {
|
||||||
|
|
||||||
|
ServerSocket s;
|
||||||
|
List<Socket> dest_sockets;
|
||||||
|
ListenerStartThread(ServerSocket in_s, List<Socket> in_dest_sockets)
|
||||||
|
{
|
||||||
|
s = in_s;
|
||||||
|
dest_sockets = in_dest_sockets;
|
||||||
|
}
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
dest_sockets.add(s.accept());
|
||||||
|
}
|
||||||
|
catch(IOException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -3,16 +3,13 @@ package chat;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
public class Message implements Serializable{
|
public class Message extends Notification {
|
||||||
|
|
||||||
private String text;
|
private String text;
|
||||||
private String author;
|
|
||||||
private Boolean redirected;
|
|
||||||
|
|
||||||
public Message(String in_author, String in_text, Boolean in_redirected)
|
Message (User in_author, String in_text, Boolean in_redirected)
|
||||||
{
|
{
|
||||||
text = in_text;
|
|
||||||
author = in_author;
|
author = in_author;
|
||||||
|
text = in_text;
|
||||||
redirected = in_redirected;
|
redirected = in_redirected;
|
||||||
}
|
}
|
||||||
public void setText(String new_text)
|
public void setText(String new_text)
|
||||||
|
|
@ -23,17 +20,4 @@ public class Message implements Serializable{
|
||||||
{
|
{
|
||||||
return text;
|
return text;
|
||||||
}
|
}
|
||||||
public void setAuthor(String new_author)
|
|
||||||
{
|
|
||||||
author = new_author;
|
|
||||||
}
|
|
||||||
public String getAuthor()
|
|
||||||
{
|
|
||||||
return author;
|
|
||||||
}
|
|
||||||
public Boolean isRedirected()
|
|
||||||
{
|
|
||||||
return redirected;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,387 +14,6 @@ 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<User> known_outdoor_users;
|
|
||||||
List<Socket> dest_sockets;
|
|
||||||
List<Socket> outdoor_dest_sockets;
|
|
||||||
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,
|
|
||||||
JTextArea in_displayArea, JTextArea in_knownUsersPanel)
|
|
||||||
{
|
|
||||||
user = in_user;
|
|
||||||
known_users = in_known_users;
|
|
||||||
known_outdoor_users = in_known_outdoor_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;
|
|
||||||
|
|
||||||
String notification;
|
|
||||||
String username;
|
|
||||||
String response = "";
|
|
||||||
|
|
||||||
byte[] buffer = new byte[100];
|
|
||||||
DatagramPacket notifPacket = new DatagramPacket(buffer, buffer.length);
|
|
||||||
DatagramSocket notifSocket;
|
|
||||||
byte[] notifBytes;
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while(!exit)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ServerSocket servSocket = new ServerSocket(1233);
|
|
||||||
System.out.println("Waiting for connection request");
|
|
||||||
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(User u:known_outdoor_users)
|
|
||||||
{
|
|
||||||
response += u.getName() + " ";
|
|
||||||
}
|
|
||||||
response = response.trim();
|
|
||||||
response += ";" + (portNumber+1);
|
|
||||||
|
|
||||||
out.println(response);
|
|
||||||
|
|
||||||
accepted = true;
|
|
||||||
for(User a:known_users)
|
|
||||||
{
|
|
||||||
accepted = accepted && (!username.equals(a.getName()));
|
|
||||||
}
|
|
||||||
for(User a:known_outdoor_users)
|
|
||||||
{
|
|
||||||
accepted = accepted && (!username.equals(a.getName()));
|
|
||||||
}
|
|
||||||
if(accepted)
|
|
||||||
{
|
|
||||||
notification = "+" + username;
|
|
||||||
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();
|
|
||||||
outdoor_dest_sockets.add(s);
|
|
||||||
}
|
|
||||||
servSocket.close();
|
|
||||||
}
|
|
||||||
catch(SocketTimeoutException e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
System.out.println(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ReceiveThread extends Thread {
|
|
||||||
User user;
|
|
||||||
Socket socket;
|
|
||||||
JTextArea displayArea;
|
|
||||||
JTextArea knownUsersPanel;
|
|
||||||
Boolean isOutdoor;
|
|
||||||
List<User> known_users;
|
|
||||||
List<User> known_outdoor_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, List<User> in_known_outdoor_users,
|
|
||||||
JTextArea in_knownUsersPanel, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets, Boolean in_isOutdoor)
|
|
||||||
{
|
|
||||||
user = in_user;
|
|
||||||
socket = in_socket;
|
|
||||||
displayArea = in_displayArea;
|
|
||||||
knownUsersPanel = in_knownUsersPanel;
|
|
||||||
known_users = in_known_users;
|
|
||||||
known_outdoor_users = in_known_outdoor_users;
|
|
||||||
dest_sockets = in_dest_sockets;
|
|
||||||
outdoor_dest_sockets = in_outdoor_dest_sockets;
|
|
||||||
isOutdoor = in_isOutdoor;
|
|
||||||
}
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
boolean exit = false;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
while(!exit)
|
|
||||||
{
|
|
||||||
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
|
|
||||||
Message message = (Message) in.readObject();
|
|
||||||
if(isOutdoor)
|
|
||||||
{
|
|
||||||
for(Socket s:dest_sockets)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
|
||||||
out.writeObject(new Message(message.getAuthor(), message.getText(), true));
|
|
||||||
}
|
|
||||||
catch(IOException e){}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if(message.getText() != null)
|
|
||||||
{
|
|
||||||
displayArea.append(message.getAuthor() + " : " + message.getText() + "\n");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
displayArea.append(message.getAuthor() + " has left the chat.\n");
|
|
||||||
for(int i = 0;i < known_users.size();i ++)
|
|
||||||
{
|
|
||||||
if (known_users.get(i).getName().equals(message.getAuthor()))
|
|
||||||
{
|
|
||||||
known_users.remove(i);
|
|
||||||
break;
|
|
||||||
//System.out.println("Removing " + message.getAuthor());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for(int i = 0;i < known_outdoor_users.size();i ++)
|
|
||||||
{
|
|
||||||
if (known_outdoor_users.get(i).getName().equals(message.getAuthor()))
|
|
||||||
{
|
|
||||||
known_outdoor_users.remove(i);
|
|
||||||
break;
|
|
||||||
//System.out.println("Removing " + message.getAuthor());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!message.isRedirected() && !message.getAuthor().equals(user.getName()))
|
|
||||||
{
|
|
||||||
socket.close();
|
|
||||||
if(!isOutdoor)
|
|
||||||
dest_sockets.remove(socket);
|
|
||||||
else
|
|
||||||
outdoor_dest_sockets.remove(socket);
|
|
||||||
}
|
|
||||||
|
|
||||||
knownUsersPanel.setText("");
|
|
||||||
knownUsersPanel.append("Indoor users:\n");
|
|
||||||
for(User a:known_users)
|
|
||||||
{
|
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
|
||||||
}
|
|
||||||
knownUsersPanel.append("\nOutdoor users:\n");
|
|
||||||
for(User a:known_outdoor_users)
|
|
||||||
{
|
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
displayArea.setCaretPosition(displayArea.getDocument().getLength());
|
|
||||||
}
|
|
||||||
if(!message.getAuthor().equals(user.getName()) && !message.isRedirected())
|
|
||||||
{
|
|
||||||
for(Socket s:outdoor_dest_sockets)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
|
||||||
out.writeObject(new Message(message.getAuthor(), message.getText(), true));
|
|
||||||
}
|
|
||||||
catch(IOException e){}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(EOFException e) {}
|
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ConnectionListenerThread extends Thread {
|
|
||||||
User user;
|
|
||||||
JTextArea displayArea;
|
|
||||||
JTextArea knownUsersPanel;
|
|
||||||
List<User> known_users;
|
|
||||||
List<User> known_outdoor_users;
|
|
||||||
List<Socket> dest_sockets;
|
|
||||||
List<Socket> outdoor_dest_sockets;
|
|
||||||
int portNumber;
|
|
||||||
|
|
||||||
ConnectionListenerThread(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, int in_portNumber)
|
|
||||||
{
|
|
||||||
user = in_user;
|
|
||||||
known_users = in_known_users;
|
|
||||||
known_outdoor_users = in_known_outdoor_users;
|
|
||||||
dest_sockets = in_dest_sockets;
|
|
||||||
outdoor_dest_sockets = in_outdoor_dest_sockets;
|
|
||||||
displayArea = in_displayArea;
|
|
||||||
knownUsersPanel = in_knownUsersPanel;
|
|
||||||
portNumber = in_portNumber;
|
|
||||||
}
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
boolean exit = false;
|
|
||||||
boolean accepted = true;
|
|
||||||
boolean outdoor;
|
|
||||||
byte[] buffer = new byte[100];
|
|
||||||
DatagramPacket request = new DatagramPacket(buffer, buffer.length);
|
|
||||||
DatagramPacket responsePacket;
|
|
||||||
|
|
||||||
DatagramSocket requestSocket;
|
|
||||||
DatagramSocket responseSocket;
|
|
||||||
|
|
||||||
String username;
|
|
||||||
String response = "";
|
|
||||||
|
|
||||||
byte[] responseBytes;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
requestSocket = new DatagramSocket(1234);
|
|
||||||
responseSocket = new DatagramSocket();
|
|
||||||
|
|
||||||
while(!exit)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
System.out.println("Waiting for connection request");
|
|
||||||
requestSocket.receive(request);
|
|
||||||
username = new String(request.getData(), 0, request.getLength());
|
|
||||||
|
|
||||||
if(username.charAt(0) == '+')
|
|
||||||
{
|
|
||||||
username = username.substring(1);
|
|
||||||
outdoor = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
outdoor = false;
|
|
||||||
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();
|
|
||||||
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();
|
|
||||||
|
|
||||||
response += ";" + (portNumber+1);
|
|
||||||
|
|
||||||
System.out.println("Response :" + response);
|
|
||||||
responseBytes = response.getBytes();
|
|
||||||
responsePacket = new DatagramPacket(responseBytes, responseBytes.length, clientAddress, 1337);
|
|
||||||
responseSocket.send(responsePacket);
|
|
||||||
}
|
|
||||||
accepted = true;
|
|
||||||
for(User a:known_users)
|
|
||||||
{
|
|
||||||
accepted = accepted && (!username.equals(a.getName()));
|
|
||||||
}
|
|
||||||
for(User a:known_outdoor_users)
|
|
||||||
{
|
|
||||||
accepted = accepted && (!username.equals(a.getName()));
|
|
||||||
}
|
|
||||||
if(accepted)
|
|
||||||
{
|
|
||||||
if(outdoor)
|
|
||||||
{
|
|
||||||
known_outdoor_users.add(new User(username));
|
|
||||||
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);
|
|
||||||
|
|
||||||
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("Indoor users:\n");
|
|
||||||
for(User a:known_users)
|
|
||||||
{
|
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
|
||||||
}
|
|
||||||
knownUsersPanel.append("\nOutdoor users:\n");
|
|
||||||
for(User a:known_outdoor_users)
|
|
||||||
{
|
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(SocketTimeoutException e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch(Exception e)
|
|
||||||
{
|
|
||||||
e.printStackTrace();
|
|
||||||
System.out.println(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ListenerStartThread extends Thread {
|
|
||||||
|
|
||||||
ServerSocket s;
|
|
||||||
List<Socket> dest_sockets;
|
|
||||||
ListenerStartThread(ServerSocket in_s, List<Socket> in_dest_sockets)
|
|
||||||
{
|
|
||||||
s = in_s;
|
|
||||||
dest_sockets = in_dest_sockets;
|
|
||||||
}
|
|
||||||
public void run()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
dest_sockets.add(s.accept());
|
|
||||||
}
|
|
||||||
catch(IOException e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class NetworkClient {
|
public class NetworkClient {
|
||||||
private User user;
|
private User user;
|
||||||
private List<User> known_users;
|
private List<User> known_users;
|
||||||
|
|
@ -506,6 +125,10 @@ public class NetworkClient {
|
||||||
{
|
{
|
||||||
known_users.add(new User (u));
|
known_users.add(new User (u));
|
||||||
}
|
}
|
||||||
|
for(String u:outdoorUsernameList)
|
||||||
|
{
|
||||||
|
known_outdoor_users.add(new User (u));
|
||||||
|
}
|
||||||
for(String a:addressList)
|
for(String a:addressList)
|
||||||
{
|
{
|
||||||
Socket s = new Socket(a, portNumber);
|
Socket s = new Socket(a, portNumber);
|
||||||
|
|
@ -571,32 +194,14 @@ public class NetworkClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
user.setName(username);
|
user.setName(username);
|
||||||
if(!outdoor)
|
|
||||||
known_users.add(new User(username));
|
|
||||||
else
|
|
||||||
known_outdoor_users.add(new User(username));
|
|
||||||
Collections.sort(known_users);
|
|
||||||
|
|
||||||
chatText.append(username + " has joined the chat.\n");
|
send(new ConnectNotification(user, false, outdoor));
|
||||||
chatText.setCaretPosition(chatText.getDocument().getLength());
|
|
||||||
|
|
||||||
knownUsersPanel.setText("");
|
|
||||||
knownUsersPanel.append("Indoor users:\n");
|
|
||||||
for(User a:known_users)
|
|
||||||
{
|
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
|
||||||
}
|
|
||||||
knownUsersPanel.append("\nOutdoor users:\n");
|
|
||||||
for(User a:known_outdoor_users)
|
|
||||||
{
|
|
||||||
knownUsersPanel.append(" " + a.getName() + " \n");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return connected;
|
return connected;
|
||||||
}
|
}
|
||||||
|
|
||||||
void send (String message)
|
void send (Notification notif)
|
||||||
{
|
{
|
||||||
for(Socket s:dest_sockets)
|
for(Socket s:dest_sockets)
|
||||||
{
|
{
|
||||||
|
|
@ -604,7 +209,7 @@ public class NetworkClient {
|
||||||
{
|
{
|
||||||
//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(new Message(user.getName(), message, false));
|
out.writeObject(notif);
|
||||||
}
|
}
|
||||||
catch(IOException e){}
|
catch(IOException e){}
|
||||||
}
|
}
|
||||||
|
|
@ -614,7 +219,7 @@ public class NetworkClient {
|
||||||
{
|
{
|
||||||
//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(new Message(user.getName(), message, false));
|
out.writeObject(notif);
|
||||||
}
|
}
|
||||||
catch(IOException e){}
|
catch(IOException e){}
|
||||||
}
|
}
|
||||||
|
|
@ -622,7 +227,7 @@ public class NetworkClient {
|
||||||
|
|
||||||
void disconnect()
|
void disconnect()
|
||||||
{
|
{
|
||||||
send(null);
|
send(new DisconnectNotification(user, false));
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Thread.sleep(1000);
|
Thread.sleep(1000);
|
||||||
|
|
@ -638,4 +243,9 @@ public class NetworkClient {
|
||||||
catch(IOException e){}
|
catch(IOException e){}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
User getUser()
|
||||||
|
{
|
||||||
|
return user;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
26
src/chat/Notification.java
Normal file
26
src/chat/Notification.java
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
|
abstract class Notification implements Serializable{
|
||||||
|
|
||||||
|
protected User author;
|
||||||
|
protected Boolean redirected;
|
||||||
|
|
||||||
|
public void setAuthor(User new_author)
|
||||||
|
{
|
||||||
|
author = new_author;
|
||||||
|
}
|
||||||
|
public User getAuthor()
|
||||||
|
{
|
||||||
|
return author;
|
||||||
|
}
|
||||||
|
public Boolean isRedirected()
|
||||||
|
{
|
||||||
|
return redirected;
|
||||||
|
}
|
||||||
|
public void setRedirected(Boolean in_redirected)
|
||||||
|
{
|
||||||
|
redirected = in_redirected;
|
||||||
|
}
|
||||||
|
}
|
||||||
115
src/chat/OutdoorListenerThread.java
Normal file
115
src/chat/OutdoorListenerThread.java
Normal file
|
|
@ -0,0 +1,115 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.DatagramPacket;
|
||||||
|
import java.net.DatagramSocket;
|
||||||
|
import java.net.InetAddress;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.net.SocketTimeoutException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.JTextArea;
|
||||||
|
|
||||||
|
class OutdoorListenerThread extends Thread {
|
||||||
|
User user;
|
||||||
|
JTextArea displayArea;
|
||||||
|
JTextArea knownUsersPanel;
|
||||||
|
List<User> known_users;
|
||||||
|
List<User> known_outdoor_users;
|
||||||
|
List<Socket> dest_sockets;
|
||||||
|
List<Socket> outdoor_dest_sockets;
|
||||||
|
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,
|
||||||
|
JTextArea in_displayArea, JTextArea in_knownUsersPanel)
|
||||||
|
{
|
||||||
|
user = in_user;
|
||||||
|
known_users = in_known_users;
|
||||||
|
known_outdoor_users = in_known_outdoor_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;
|
||||||
|
|
||||||
|
String notification;
|
||||||
|
String username;
|
||||||
|
String response = "";
|
||||||
|
|
||||||
|
byte[] buffer = new byte[100];
|
||||||
|
DatagramPacket notifPacket = new DatagramPacket(buffer, buffer.length);
|
||||||
|
DatagramSocket notifSocket;
|
||||||
|
byte[] notifBytes;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while(!exit)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ServerSocket servSocket = new ServerSocket(1233);
|
||||||
|
System.out.println("Waiting for connection request");
|
||||||
|
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(User u:known_outdoor_users)
|
||||||
|
{
|
||||||
|
response += u.getName() + " ";
|
||||||
|
}
|
||||||
|
response = response.trim();
|
||||||
|
response += ";" + (portNumber+1);
|
||||||
|
|
||||||
|
out.println(response);
|
||||||
|
|
||||||
|
accepted = true;
|
||||||
|
for(User a:known_users)
|
||||||
|
{
|
||||||
|
accepted = accepted && (!username.equals(a.getName()));
|
||||||
|
}
|
||||||
|
for(User a:known_outdoor_users)
|
||||||
|
{
|
||||||
|
accepted = accepted && (!username.equals(a.getName()));
|
||||||
|
}
|
||||||
|
if(accepted)
|
||||||
|
{
|
||||||
|
notification = "+" + username;
|
||||||
|
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();
|
||||||
|
outdoor_dest_sockets.add(s);
|
||||||
|
}
|
||||||
|
servSocket.close();
|
||||||
|
}
|
||||||
|
catch(SocketTimeoutException e) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
152
src/chat/ReceiveThread.java
Normal file
152
src/chat/ReceiveThread.java
Normal file
|
|
@ -0,0 +1,152 @@
|
||||||
|
package chat;
|
||||||
|
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.ObjectInputStream;
|
||||||
|
import java.io.ObjectOutputStream;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.swing.JTextArea;
|
||||||
|
|
||||||
|
class ReceiveThread extends Thread {
|
||||||
|
User user;
|
||||||
|
Socket socket;
|
||||||
|
JTextArea displayArea;
|
||||||
|
JTextArea knownUsersPanel;
|
||||||
|
Boolean isOutdoor;
|
||||||
|
List<User> known_users;
|
||||||
|
List<User> known_outdoor_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, List<User> in_known_outdoor_users,
|
||||||
|
JTextArea in_knownUsersPanel, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets, Boolean in_isOutdoor)
|
||||||
|
{
|
||||||
|
user = in_user;
|
||||||
|
socket = in_socket;
|
||||||
|
displayArea = in_displayArea;
|
||||||
|
knownUsersPanel = in_knownUsersPanel;
|
||||||
|
known_users = in_known_users;
|
||||||
|
known_outdoor_users = in_known_outdoor_users;
|
||||||
|
dest_sockets = in_dest_sockets;
|
||||||
|
outdoor_dest_sockets = in_outdoor_dest_sockets;
|
||||||
|
isOutdoor = in_isOutdoor;
|
||||||
|
}
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
boolean exit = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
while(!exit)
|
||||||
|
{
|
||||||
|
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
|
||||||
|
Notification notif = (Notification) in.readObject();
|
||||||
|
|
||||||
|
if(isOutdoor)
|
||||||
|
{
|
||||||
|
for(Socket s:dest_sockets)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||||
|
notif.setRedirected(true);
|
||||||
|
out.writeObject(notif);
|
||||||
|
}
|
||||||
|
catch(IOException e){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(notif instanceof Message)
|
||||||
|
{
|
||||||
|
Message m = (Message) notif;
|
||||||
|
displayArea.append(m.getAuthor() + " : " + m.getText() + "\n");
|
||||||
|
}
|
||||||
|
else if (notif instanceof DisconnectNotification)
|
||||||
|
{
|
||||||
|
DisconnectNotification dn = (DisconnectNotification) notif;
|
||||||
|
|
||||||
|
displayArea.append(dn.getAuthor().getName() + " has left the chat.\n");
|
||||||
|
for(int i = 0;i < known_users.size();i ++)
|
||||||
|
{
|
||||||
|
if (known_users.get(i).getName().equals(dn.getAuthor()))
|
||||||
|
{
|
||||||
|
known_users.remove(i);
|
||||||
|
break;
|
||||||
|
//System.out.println("Removing " + message.getAuthor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(int i = 0;i < known_outdoor_users.size();i ++)
|
||||||
|
{
|
||||||
|
if (known_outdoor_users.get(i).getName().equals(dn.getAuthor()))
|
||||||
|
{
|
||||||
|
known_outdoor_users.remove(i);
|
||||||
|
break;
|
||||||
|
//System.out.println("Removing " + message.getAuthor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!dn.isRedirected() && !dn.getAuthor().equals(user.getName()))
|
||||||
|
{
|
||||||
|
socket.close();
|
||||||
|
if(!isOutdoor)
|
||||||
|
dest_sockets.remove(socket);
|
||||||
|
else
|
||||||
|
outdoor_dest_sockets.remove(socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (notif instanceof ConnectNotification)
|
||||||
|
{
|
||||||
|
ConnectNotification cn = (ConnectNotification) notif;
|
||||||
|
|
||||||
|
displayArea.append(cn.getAuthor().getName() + " has joined the chat.\n");
|
||||||
|
if(cn.isOutdoor())
|
||||||
|
{
|
||||||
|
known_outdoor_users.add(cn.getAuthor());
|
||||||
|
Collections.sort(known_outdoor_users);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
known_users.add(cn.getAuthor());
|
||||||
|
Collections.sort(known_users);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
knownUsersPanel.setText("");
|
||||||
|
knownUsersPanel.append("Indoor users:\n");
|
||||||
|
for(User a:known_users)
|
||||||
|
{
|
||||||
|
knownUsersPanel.append(" " + a.getName() + " \n");
|
||||||
|
}
|
||||||
|
knownUsersPanel.append("\nOutdoor users:\n");
|
||||||
|
for(User a:known_outdoor_users)
|
||||||
|
{
|
||||||
|
knownUsersPanel.append(" " + a.getName() + " \n");
|
||||||
|
}
|
||||||
|
displayArea.setCaretPosition(displayArea.getDocument().getLength());
|
||||||
|
}
|
||||||
|
if(!notif.getAuthor().equals(user.getName()) && !notif.isRedirected())
|
||||||
|
{
|
||||||
|
for(Socket s:outdoor_dest_sockets)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
|
||||||
|
notif.setRedirected(true);
|
||||||
|
out.writeObject(notif);
|
||||||
|
}
|
||||||
|
catch(IOException e){}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch(EOFException e) {}
|
||||||
|
catch(Exception e)
|
||||||
|
{
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue