Advertisement
Guest User

Untitled

a guest
Dec 15th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.69 KB | None | 0 0
  1. import javax.net.ssl.*;
  2. import java.io.FileInputStream;
  3. import java.io.ObjectInputStream;
  4. import java.io.ObjectOutputStream;
  5. import java.security.KeyStore;
  6. import java.security.MessageDigest;
  7. import java.security.SecureRandom;
  8. import java.time.LocalTime;
  9. import java.util.ArrayList;
  10. import java.util.Base64;
  11. import java.util.concurrent.LinkedBlockingQueue;
  12.  
  13. public class Server {
  14.  
  15. boolean running = true;
  16.  
  17. SSLServerSocket ssocket;
  18. LinkedBlockingQueue<Message> messageQueue;
  19. ArrayList<ClientConnection> clientConnecctions;
  20.  
  21. public static void main(String args[]) throws Exception{
  22. Server server = new Server(6666, 1);
  23.  
  24. }
  25.  
  26. public Server(int port, int clientPoolSize) throws Exception {
  27. //Load keystore from server certificate
  28. KeyStore keyStore = KeyStore.getInstance("JKS");
  29. FileInputStream in = new FileInputStream("cert.jks");
  30. keyStore.load(in, "projectCertificate".toCharArray());
  31. in.close();
  32.  
  33. //Initialize key manager factory from keystore
  34. KeyManagerFactory kmFactory = KeyManagerFactory.getInstance("X509");
  35. kmFactory.init(keyStore, "projectCertificate".toCharArray());
  36.  
  37. //Initialize ssl context from key manager factory
  38. SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
  39. sslContext.init(kmFactory.getKeyManagers(), null, new SecureRandom());
  40.  
  41. //Get ssl server socket factory from ssl context
  42. SSLServerSocketFactory ssocketFactory = sslContext.getServerSocketFactory();
  43.  
  44. //Create ssl server socket from ssl server socket factory
  45. ssocket = (SSLServerSocket) ssocketFactory.createServerSocket(port);
  46.  
  47. clientConnecctions = new ArrayList();
  48.  
  49. //While server is running, accept clients and run new threads
  50. Thread acceptConnections = new Thread() {
  51. @Override
  52. public void run() {
  53. while(running) {
  54. try {
  55. SSLSocket client = (SSLSocket) ssocket.accept();
  56. ClientConnection clientConnection = new ClientConnection(client);
  57. clientConnecctions.add(clientConnection);
  58. }
  59. catch(Exception e) {
  60. e.printStackTrace();
  61. }
  62. }
  63. }
  64. };
  65. acceptConnections.setDaemon(true);
  66. acceptConnections.start();
  67.  
  68. //While server is running, process every message added to the queue
  69. Thread processMessages = new Thread() {
  70. @Override
  71. public void run() {
  72. while(running) {
  73. try {
  74. Message received = messageQueue.take();
  75. for(ClientConnection conn : clientConnecctions) {
  76. conn.send(new Message(received.getScreenName(), passwordHash(received.getPassword()), received.getMessage(), LocalTime.now()));
  77. }
  78. }
  79. catch(Exception e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. }
  84. };
  85. processMessages.setDaemon(true);
  86. processMessages.start();
  87.  
  88. }
  89.  
  90. private String passwordHash(String password) throws Exception {
  91. Base64.Encoder encoder = Base64.getEncoder();
  92. MessageDigest hashFunction = MessageDigest.getInstance("SHA-256");
  93. return encoder.encodeToString(hashFunction.digest(password.getBytes()));
  94. }
  95.  
  96. private class ClientConnection {
  97.  
  98. private SSLSocket client;
  99. private ObjectInputStream in;
  100. private ObjectOutputStream out;
  101.  
  102. public ClientConnection(SSLSocket client) throws Exception {
  103. this.client = client;
  104. this.in = new ObjectInputStream(client.getInputStream());
  105. this.out = new ObjectOutputStream(client.getOutputStream());
  106.  
  107. Thread receive = new Thread() {
  108. @Override
  109. public void run() {
  110. while(true) {
  111. try {
  112. messageQueue.put((Message) in.readObject());
  113. }
  114. catch(Exception e) {
  115. e.printStackTrace();
  116. }
  117. }
  118. }
  119. };
  120. receive.setDaemon(true);
  121. receive.start();
  122. }
  123.  
  124. public void send(Message message) {
  125. try {
  126. out.writeObject(message);
  127. }
  128. catch(Exception e) {
  129. e.printStackTrace();
  130. }
  131. }
  132.  
  133. }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement