121 lines
3.3 KiB
Java
121 lines
3.3 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());
|
|
|
|
|
|
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)
|
|
{
|
|
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());
|
|
}
|
|
}
|
|
}
|