Client Server w/ Group-Chat.

This commit is contained in:
Sebastian Lenzlinger 2022-03-21 22:44:29 +01:00
parent 4fcd68fef5
commit 5f01e494f4
5 changed files with 226 additions and 39 deletions

View File

@ -0,0 +1,96 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Client;
import java.net.Socket;
import java.io.*;
import java.util.Scanner;
public class Client {
private Socket socket;
private BufferedReader in;
private BufferedWriter out;
public String userName;
public Client(Socket socket, String userName) {
try {
this.socket = socket;
this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
this.in = new BufferedReader((new InputStreamReader((socket.getInputStream()))));
this.userName = userName;
} catch (IOException e) {
e.printStackTrace();
closeEverything(socket, in, out);
}
}
public void sendMessage() {
try {
out.write(userName);
out.newLine();
out.flush();
Scanner sc = new Scanner(System.in);
while (socket.isConnected()) {
String msg = sc.nextLine();
out.write(userName + ": " + msg);
out.newLine();
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
closeEverything(socket, in, out);
}
}
public void chatListener() {
new Thread(new Runnable() {
@Override
public void run() {
String chatMsg;
while(socket.isConnected()) {
try {
chatMsg = in.readLine();
System.out.println(chatMsg);
} catch (IOException e) {
e.printStackTrace();
closeEverything(socket, in, out);
}
}
}
}).start();
}
public void closeEverything(Socket socket, BufferedReader in, BufferedWriter out) {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Choose a nickname: ");
String username = sc.next();
Socket socket;
try {
socket = new Socket("localhost", 42069);
Client client = new Client(socket, username);
client.chatListener();
client.sendMessage();
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -1,29 +0,0 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Client;
import java.io.*;
import java.net.Socket;
public class ClientThread implements Runnable {
private int name;
private final Socket socket;
public ClientThread(int name, Socket socket) {
this.name = name;
this.socket = socket;
}
@Override
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
while(socket.isConnected()){
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,4 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
public class Chat {
}

View File

@ -1,4 +1,86 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
public class ClientHandler {
import java.io.*;
import java.net.Socket;
import java.util.HashSet;
import java.util.Scanner;
public class ClientHandler implements Runnable{
private String clientUserName;
private BufferedWriter out;
private BufferedReader in;
private Socket socket;
Scanner sc;
public static HashSet<ClientHandler> clientHandlers = new HashSet<>();
public ClientHandler(Socket socket) {
try {
this.socket = socket;
this.out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
this.in = new BufferedReader((new InputStreamReader((socket.getInputStream()))));
this.clientUserName = in.readLine();
clientHandlers.add(this);
broadcastMessage("SERVER: " + clientUserName + " has joined the Server");
} catch (IOException e) {
e.printStackTrace();
closeEverything(socket, in, out);
}
}
@Override
public void run() {
String msg;
while(socket.isConnected()) {
try {
msg = in.readLine();
broadcastMessage(msg);
} catch (IOException e) {
e.printStackTrace();
closeEverything(socket, in, out);
break;
}
}
}
public void broadcastMessage(String msg) {
for (ClientHandler client : clientHandlers) {
try {
if(!client.clientUserName.equals((clientUserName))) {
client.out.write(msg);
client.out.newLine();
client.out.flush();
} else {
client.out.write("Message +" + msg + "* sent!");
client.out.newLine();
client.out.flush();
}
} catch (IOException e) {
e.printStackTrace();
closeEverything(socket, in ,out);
}
}
}
public void removeClientHandler() {
clientHandlers.remove(this);
broadcastMessage("SERVER: " + clientUserName + " has left the server");
}
public void closeEverything(Socket socket, BufferedReader in, BufferedWriter out) {
removeClientHandler();
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
if (socket != null) {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -1,27 +1,61 @@
package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
import java.io.IOException;
import ch.unibas.dmi.dbis.cs108.Multiplayer.Client.Client;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.HashSet;
public class Server {
private static final int gamePort = 42069;
private static int clientIndex = 0;
private HashMap<String, Integer> nameToIndex = new HashMap<>();
private HashMap<Integer, ClientHandler> indexToHandler = new HashMap<>();
private ServerSocket serverSocket;
public static void main(String[] args) {
public Server(ServerSocket serverSocket) {
this.serverSocket = serverSocket;
}
public void startServer() {
try {
ServerSocket gameServer = new ServerSocket(gamePort);
System.out.println("Waiting for a connection on Port 42069");
while(true) {
Socket client = gameServer.accept();
while (true) {
Socket socket = serverSocket.accept();
System.out.println("Port 42069 open on ");
ClientHandler nextClient = new ClientHandler(socket);
Thread th = new Thread(nextClient);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void closeServerSocket() {
try {
if (serverSocket != null){
serverSocket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(gamePort);
} catch (IOException e) {
e.printStackTrace();
}
Server server = new Server(serverSocket);
server.startServer();
}
public static void broadcast(String msg){
//TODO
}
}