Advertisement
Guest User

Untitled

a guest
Sep 18th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.17 KB | None | 0 0
  1. package fr.helliotk.redisinterfaceserver.networking;
  2.  
  3. import lombok.Getter;
  4.  
  5. import java.io.*;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.*;
  9.  
  10. public class ServerManager {
  11.  
  12. @Getter
  13. private int port;
  14.  
  15. private ServerManager instance;
  16. @Getter
  17. private ServerSocket serverSocket;
  18.  
  19. private boolean isServerOn = false;
  20. private Thread listenConnectionsThread;
  21.  
  22. private ArrayList<ConnectedClient> connectedClients = new ArrayList<>();
  23. private ArrayList<Thread> authThreads = new ArrayList<>();
  24. private HashMap<String, String> users = new HashMap<>();
  25. private int clientsNumber;
  26.  
  27. public ServerManager(int port) {
  28. this.port = port;
  29.  
  30. try {
  31. serverSocket = new ServerSocket(port);
  32. isServerOn = true;
  33. this.instance = this;
  34. clientsNumber = 0;
  35.  
  36. users.put("Helliot", "bite");
  37. users.put("Qilat", "queue");
  38.  
  39. enableListenConnections(); //async
  40.  
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. }
  45.  
  46. private void enableListenConnections(){
  47. listenConnectionsThread = new Thread(new Runnable() {
  48. @Override
  49. public void run() {
  50. listenConnections();
  51. }
  52. }, "Server-Listen-Connections");
  53.  
  54. listenConnectionsThread.start();
  55. }
  56.  
  57. private void disableListenConnections(){
  58. if(listenConnectionsThread != null && !listenConnectionsThread.isInterrupted()){
  59. listenConnectionsThread.interrupt();
  60. }
  61. }
  62.  
  63. private void listenConnections(){
  64. try {
  65. Socket socket = serverSocket.accept();
  66. if(socket != null){
  67. handleAuth(socket);
  68.  
  69. if(isServerOn)
  70. listenConnections();
  71. }
  72. }catch (IOException e){
  73. e.printStackTrace();
  74. }
  75. }
  76. private void handleAuth(Socket socket){
  77. try{
  78. InputStream inputStream = socket.getInputStream();
  79. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  80.  
  81. String authString = reader.readLine();
  82. if(authString != null && authString.length() > 0){
  83. String[] authArray = authString.split(":");
  84. if(authArray.length == 3 && authArray[0].equals("AUTH_PACKET_INPUT")){
  85. String username = authArray[1];
  86. String password = authArray[2];
  87.  
  88. if(users.containsKey(username)){
  89. if(password.equals(users.get(username))){
  90. if(getClient(username) == null){
  91. acceptClient(socket, username);
  92. }else{
  93. denyClient(socket, "Already connected");
  94. }
  95. }else{
  96. denyClient(socket, "Wrong password");
  97. }
  98. }else{
  99. denyClient(socket, "Username not registered");
  100. }
  101. }else{
  102. denyClient(socket, "Invalid auth string");
  103. }
  104. }else{
  105. denyClient(socket, "Invalid auth string");
  106. }
  107. }catch (IOException e){
  108. e.printStackTrace();
  109. }
  110. }
  111.  
  112. private void acceptClient(Socket socket, String username){
  113. UUID uuid = UUID.randomUUID();
  114. ConnectedClient client = new ConnectedClient(uuid, socket, instance, username);
  115. connectedClients.add(client);
  116. client.enableListening();
  117. System.out.println("Client " + username + " connected ! UUID: " + uuid);
  118. sendMessage("AUTH_PACKET_OUTPUT:true", client);
  119. broadcast("Client " + username + " connected !");
  120. }
  121.  
  122. private void denyClient(Socket socket, String message){
  123. try{
  124. OutputStream outputStream = socket.getOutputStream();
  125. PrintStream writer = new PrintStream(outputStream, true);
  126. writer.println("AUTH_PACKET_OUTPUT:false:" + message);
  127.  
  128. socket.close();
  129. }catch (IOException e){
  130. e.printStackTrace();
  131. }
  132. }
  133.  
  134. public void broadcast(String message){
  135. ArrayList<ConnectedClient> clonedConnectedClients = clonedConnectedClients();
  136. for (ConnectedClient client : clonedConnectedClients) {
  137. sendMessage(message, client);
  138. }
  139. }
  140.  
  141. public void readMessage(String message, ConnectedClient author) {
  142. String formatedMessage = "Client " + author.getUsername() + " sent: " + message;
  143. System.out.println(formatedMessage);
  144. ArrayList<ConnectedClient> clonedConnectedClients = clonedConnectedClients();
  145. clonedConnectedClients.remove(author);
  146. for (ConnectedClient client : clonedConnectedClients) {
  147. sendMessage(formatedMessage, client);
  148. }
  149. /*
  150. if (message.equals("cutServer"))
  151. closeServer();
  152. */
  153.  
  154. }
  155.  
  156. public void sendMessage(String message, ConnectedClient target) {
  157. try {
  158. OutputStream outputStream = target.getSocket().getOutputStream();
  159. PrintStream writer = new PrintStream(outputStream, true);
  160.  
  161. writer.println(message);
  162. } catch (IOException e) {
  163. e.printStackTrace();
  164. }
  165. }
  166.  
  167. public void disconnectClient(ConnectedClient client){
  168. try {
  169. client.setConnected(false);
  170. client.disableListening();
  171.  
  172. if(!client.getSocket().isClosed()) {
  173. client.getSocket().close();
  174. }
  175. System.out.println("Client " + client.getUsername() + " disconnected !");
  176. broadcast("Client " + client.getUsername() + " disconnected !");
  177. connectedClients.remove(client);
  178. clientsNumber--;
  179. }catch (IOException e){
  180. e.printStackTrace();
  181. }
  182. }
  183.  
  184. private void closeServer(){
  185. System.out.println("Closing server...");
  186.  
  187. disableListenConnections();
  188.  
  189. for (ConnectedClient connectedClient : connectedClients) {
  190. disconnectClient(connectedClient);
  191. }
  192.  
  193. isServerOn = false;
  194.  
  195. try {
  196. serverSocket.close();
  197. }catch (IOException e){
  198. e.printStackTrace();
  199. }
  200.  
  201. System.out.println("Server closed");
  202. }
  203.  
  204. @SuppressWarnings("unchecked")
  205. private ArrayList<ConnectedClient> clonedConnectedClients(){
  206. return ((ArrayList<ConnectedClient>) connectedClients.clone());
  207. }
  208.  
  209. public ConnectedClient getClient(String username){
  210. for (ConnectedClient client : clonedConnectedClients()) {
  211. if(client.getUsername().equalsIgnoreCase(username))
  212. return client;
  213. }
  214.  
  215. return null;
  216. }
  217.  
  218. public ConnectedClient getClient(UUID uuid){
  219. for (ConnectedClient client : clonedConnectedClients()) {
  220. if(client.getUuid().equals(uuid))
  221. return client;
  222. }
  223.  
  224. return null;
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement