diff --git a/netwerk-programming-eindopdracht.iml b/netwerk-programming-eindopdracht.iml index c90834f..28ac7fd 100644 --- a/netwerk-programming-eindopdracht.iml +++ b/netwerk-programming-eindopdracht.iml @@ -1,5 +1,10 @@ + + + diff --git a/src/client/Client.java b/src/client/Client.java new file mode 100644 index 0000000..ef0b379 --- /dev/null +++ b/src/client/Client.java @@ -0,0 +1,72 @@ +package client; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; +import java.util.Scanner; + +public class Client { + private int port; + private String hostname; + private boolean isConnected = true; + + public static void main(String[] args) { + Client client = new Client("localhost",8000); + client.connect(); + + } + + public Client(String hostname, int port) { + this.port = port; + this.hostname = hostname; + } + + public void connect() { + System.out.println("[CLIENT] connecting to server on port " + port); + Scanner scanner = new Scanner(System.in); + try { + Socket socket = new Socket(hostname,port); + DataInputStream in = new DataInputStream(socket.getInputStream()); + DataOutputStream out = new DataOutputStream(socket.getOutputStream()); + + Thread readSocketThread = new Thread( () -> { + receiveDataFromSocket(in); + }); + + readSocketThread.start(); + + String input = ""; + + while (!input.equals("\\quit")) { + input = scanner.nextLine(); + out.writeUTF(input); + } + + isConnected = false; + + socket.close(); + + try { + readSocketThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void receiveDataFromSocket(DataInputStream in) { + String received = ""; + while (isConnected) { + try { + received = in.readUTF(); + System.out.println(received); + } catch (IOException e) { + System.out.println("exception caught - " + e.getMessage());; + } + } + } +} diff --git a/src/server/Server.java b/src/server/Server.java new file mode 100644 index 0000000..337a4bb --- /dev/null +++ b/src/server/Server.java @@ -0,0 +1,92 @@ +package server; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.ArrayList; +import java.util.HashMap; + +public class Server { + private ServerSocket serverSocket; + private int port = 8000; + private ArrayList clients = new ArrayList<>(); + private HashMap clientThreads = new HashMap<>(); + + public static void main(String[] args) { + Server server = new Server(); + server.connect(); + } + + public void connect() { + try { + this.serverSocket = new ServerSocket(port); + boolean running = true; + while (running) { + System.out.println("[SERVER] listening on port " + port); + Socket socket = serverSocket.accept(); + + System.out.println("[SERVER] got new client on " + socket.getInetAddress().getHostAddress()); + DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); + DataInputStream inputStream = new DataInputStream(socket.getInputStream()); + + outputStream.writeUTF("Enter nickname: "); + String nickname = inputStream.readUTF(); + + System.out.println("[SERVER] got nickname " + nickname); + ServerClient serverClient = new ServerClient(nickname, socket,this); + + Thread t = new Thread(serverClient); + t.start(); + + clientThreads.put(nickname,t); + this.clients.add(serverClient); + + sendMessage(nickname, "--- Welcome! ---\nPeople online : " + clients.size()); + + for (ServerClient client : clients) { + sendToEveryoneExcept(nickname,nickname + " joined the server! [" + socket.getInetAddress().getHostAddress() + "]"); + } + + } + + this.serverSocket.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void sendToEveryone(String text) { + for (ServerClient serverClient : clients) { + serverClient.writeUTF(text); + } + } + + public void sendToEveryoneExcept(String name, String text) { + for (ServerClient serverClient : clients) { + if (!serverClient.getName().equals(name)) + serverClient.writeUTF(text); + } + } + + public void sendMessage(String name, String text) { + for (ServerClient serverClient : clients) { + if (serverClient.getName().equals(name)) { + serverClient.writeUTF(text); + break; + } + } + } + + public void removeClient(ServerClient serverClient) { + this.clients.remove(serverClient); + try { + this.clientThreads.get(serverClient.getName()).join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + this.clientThreads.remove(serverClient.getName()); + this.sendToEveryone(serverClient.getName() + " left!"); + } +} diff --git a/src/server/ServerClient.java b/src/server/ServerClient.java new file mode 100644 index 0000000..44f8773 --- /dev/null +++ b/src/server/ServerClient.java @@ -0,0 +1,69 @@ +package server; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.net.Socket; + +public class ServerClient implements Runnable { + private DataInputStream in; + private DataOutputStream out; + private Socket socket; + private String name; + private Server server; + private boolean isConnected = false; + + public ServerClient(String name, Socket socket, Server server) { + this.name = name; + this.server = server; + this.socket = socket; + try { + this.in = new DataInputStream(socket.getInputStream()); + this.out = new DataOutputStream(socket.getOutputStream()); + this.isConnected = true; + } catch (IOException e) { + this.isConnected = false; + e.printStackTrace(); + } + } + + public void readUTF() { + try { + System.out.println("[SERVERCLIENT] got message: " + in.readUTF()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public void writeUTF(String text) { + try { + this.out.writeUTF(text); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void run() { + while (isConnected) { + try { + String received = this.in.readUTF(); + if (received.equals("\\quit")) { + isConnected = false; + this.server.removeClient(this); + } else { + this.server.sendToEveryoneExcept(this.name,"<" + this.name + "> : " + received); + } + } catch (IOException e) { + System.out.println("[SERVERCLIENT] caught exception - " + e.getMessage()); + System.out.println("[SERVERCLIENT] terminating failing connection..."); + isConnected = false; + System.out.println("[SERVERCLIENT] done!"); + } + } + } + + public String getName() { + return name; + } +}