Client Server w/ Group-Chat.
This commit is contained in:
parent
4fcd68fef5
commit
5f01e494f4
@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,4 @@
|
|||||||
|
package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
|
||||||
|
|
||||||
|
public class Chat {
|
||||||
|
}
|
||||||
@ -1,4 +1,86 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,27 +1,61 @@
|
|||||||
package ch.unibas.dmi.dbis.cs108.Multiplayer.Server;
|
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.ServerSocket;
|
||||||
import java.net.Socket;
|
import java.net.Socket;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
|
||||||
public class Server {
|
public class Server {
|
||||||
|
|
||||||
private static final int gamePort = 42069;
|
private static final int gamePort = 42069;
|
||||||
private static int clientIndex = 0;
|
private ServerSocket serverSocket;
|
||||||
private HashMap<String, Integer> nameToIndex = new HashMap<>();
|
|
||||||
private HashMap<Integer, ClientHandler> indexToHandler = new HashMap<>();
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public Server(ServerSocket serverSocket) {
|
||||||
|
this.serverSocket = serverSocket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startServer() {
|
||||||
try {
|
try {
|
||||||
ServerSocket gameServer = new ServerSocket(gamePort);
|
|
||||||
System.out.println("Waiting for a connection on Port 42069");
|
|
||||||
while (true) {
|
while (true) {
|
||||||
Socket client = gameServer.accept();
|
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) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user