COO-farina-vincent/src/chat/NetworkClient.java
2021-01-12 18:08:16 +01:00

406 lines
11 KiB
Java
Raw Blame History

package chat;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import chat.User;
import chat.Message;
//class SendThread extends Thread {
// String address;
// Message message;
// int port;
//
// SendThread(Message in_message, String in_address, int in_port)
// {
// message = in_message;
// address = in_address;
// port = in_port;
// }
// public void run()
// {
// Socket link;
// boolean connected = false;
// ObjectOutputStream out;
//
// while(!connected)
// {
// try
// {
// link = new Socket(address, port);
// out = new ObjectOutputStream(link.getOutputStream());
// out.writeObject(message);
// connected = true;
// }
// catch(IOException e)
// {
// e.printStackTrace();
// connected = false;
// }
// }
//
// }
//}
class ReceiveThread extends Thread {
Socket socket;
JTextArea displayArea;
JTextArea knownUsersPanel;
List<User> known_users;
List<Socket> dest_sockets;
ReceiveThread(Socket in_socket, JTextArea in_displayArea, List<User> in_known_users, JTextArea in_knownUsersPanel, List<Socket> in_dest_sockets)
{
socket = in_socket;
displayArea = in_displayArea;
knownUsersPanel = in_knownUsersPanel;
known_users = in_known_users;
dest_sockets = in_dest_sockets;
}
public void run()
{
boolean exit = false;
try
{
while(!exit)
{
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
Message message = (Message) in.readObject();
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());
}
}
knownUsersPanel.setText("");
knownUsersPanel.append("Online:\n");
for(User u:known_users)
{
knownUsersPanel.append(" " + u.getName() + " \n");
}
exit = true;
}
displayArea.setCaretPosition(displayArea.getDocument().getLength());
}
socket.close();
dest_sockets.remove(socket);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
class ConnectionListenerThread extends Thread {
JTextArea displayArea;
JTextArea knownUsersPanel;
List<User> known_users;
List<Socket> dest_sockets;
ConnectionListenerThread(List<User> in_known_users, List<Socket> in_dest_sockets, JTextArea in_displayArea, JTextArea in_knownUsersPanel)
{
known_users = in_known_users;
dest_sockets = in_dest_sockets;
displayArea = in_displayArea;
knownUsersPanel = in_knownUsersPanel;
}
public void run()
{
boolean exit = false;
boolean accepted = true;
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(Socket s:dest_sockets)
{
response += s.getInetAddress().getHostAddress() + " ";
}
response = response.trim();
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()));
}
if(accepted)
{
Socket s = (new ServerSocket(1237+(known_users.size()))).accept();
(new ReceiveThread(s, displayArea, known_users, knownUsersPanel, dest_sockets)).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("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 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 {
private User user;
private List<User> known_users;
private List<Socket> dest_sockets;
private JTextArea chatText;
private JTextArea knownUsersPanel;
static String getLocalIP() {
String ip = "";
try(final DatagramSocket socket = new DatagramSocket()){
socket.connect(InetAddress.getByName("8.8.8.8"), 10002);
ip = socket.getLocalAddress().getHostAddress();
}
catch(Exception e)
{
System.out.println("niiiiiiiikkk");
}
return ip;
}
NetworkClient(JTextArea in_chatText, JTextArea in_knownUsersPanel)
{
user = new User("");
chatText = in_chatText;
knownUsersPanel = in_knownUsersPanel;
known_users = new ArrayList<User>();
dest_sockets = new ArrayList<Socket>();
}
boolean connect(String username)
{
boolean nameAvailable = true;
boolean connected = false;
DatagramSocket connectionSocket;
DatagramSocket userListSocket;
DatagramPacket connectionRequest;
DatagramPacket responsePacket;
byte[] buffer1 = new byte[20000];
if(username == null || username.compareTo("") == 0)
return false;
try
{
connectionSocket = new DatagramSocket();
userListSocket = new DatagramSocket(1337);
userListSocket.setSoTimeout(500);
connectionRequest = new DatagramPacket(username.getBytes(), username.length(),
InetAddress.getByName("25.255.255.255"), 1234);
System.out.println("Sending connection request");
connectionSocket.send(connectionRequest);
try
{
responsePacket = new DatagramPacket(buffer1, buffer1.length);
System.out.println("Waiting for reply");
userListSocket.receive(responsePacket);
System.out.println("Received a reply from " + responsePacket.getAddress().getHostAddress());
String[] response = new String(responsePacket.getData()).split(";");
String[] usernameList = response[0].split(" ");
String[] addressList = response[1].split(" ");
for(String u:usernameList)
{
nameAvailable = nameAvailable && (!username.equals(u));
}
if(nameAvailable)
{
System.out.println(usernameList.length + " users currently connected");
for(String u:usernameList)
{
known_users.add(new User (u));
}
for(String a:addressList)
{
Socket s = new Socket(a, (1237+usernameList.length));
dest_sockets.add(s);
(new ReceiveThread(s, chatText, known_users, knownUsersPanel, dest_sockets)).start();
}
Collections.sort(known_users);
connected = true;
}
}
catch(SocketTimeoutException e)
//Si on est tout seul sur le r<>seau (on ne re<72>oit aucune r<>ponse)
{
System.out.println("Reply timed out");
connected = true;
}
connectionSocket.close();
userListSocket.close();
}
catch (SocketException e2)
{
e2.printStackTrace();
}
catch (Exception e3)
{
System.out.println(e3.getMessage());
}
if(connected)
{
(new ConnectionListenerThread(known_users, dest_sockets, chatText, knownUsersPanel)).start();
try
{
ServerSocket s1 = new ServerSocket(1237+(known_users.size()));
(new ListenerStartThread(s1, dest_sockets)).start();
Socket s2 = new Socket("25.67.234.235", 1237+(known_users.size()));
(new ReceiveThread(s2, chatText, known_users, knownUsersPanel, dest_sockets)).start();
}
catch(IOException e)
{
e.printStackTrace();
}
user.setName(username);
known_users.add(new User(username));
chatText.append(username + " has joined the chat.\n");
chatText.setCaretPosition(chatText.getDocument().getLength());
knownUsersPanel.setText("");
knownUsersPanel.append(" Online :\n");
for(User a:known_users)
{
knownUsersPanel.append(" " + a.getName() + " \n");
}
}
return connected;
}
void send (String message)
{
// for(User recipient:known_users)
// {
// SendThread t1 = new SendThread(new Message(user.getName(), message), recipient.getAddress(), 1237);
// t1.start();
// }
for(Socket s:dest_sockets)
{
try
{
ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
out.writeObject(new Message(user.getName(), message));
}
catch(IOException e){}
}
}
void disconnect()
{
send(null);
for(Socket s:dest_sockets)
{
try
{
s.close();
}
catch(IOException e){}
}
}
}