COO-farina-vincent/src/chat/ConnectionListenerThread.java
2021-02-15 12:34:31 +01:00

136 lines
3.6 KiB
Java

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());
}
}
}