Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. import java.io.*;
  2. import java.net.*;
  3. import java.util.*;
  4.  
  5. public class Server
  6. {
  7. public static final int PORT = 50007;
  8. //set of unique clients names
  9. private static Set<String> names = new HashSet<>();
  10. //set of unique client senders
  11. private static Set<PrintWriter> senders = new HashSet<>();
  12.  
  13. public static void main(String args[]) throws IOException
  14. {
  15. //create server socket
  16. ServerSocket server = new ServerSocket(PORT);
  17. Socket client;
  18.  
  19. System.out.println("Waiting for connection to:" + server);
  20. while(true)
  21. {
  22. //waiting for client connection
  23. client = server.accept();
  24. //create new thread for handling new client
  25. new ClientHandler(client).start();
  26. }
  27. }
  28. private static class ClientHandler extends Thread
  29. {
  30. private String name; //client name
  31. private Socket client; //client socket
  32.  
  33. private BufferedReader clientReceiver; //receiver
  34. private PrintWriter clientSender; //sender
  35. public ClientHandler(Socket client)
  36. {
  37. this.client = client;
  38. }
  39. public void run()
  40. {
  41. try
  42. {
  43. //create receiver stream
  44. this.clientReceiver = new BufferedReader(new InputStreamReader(this.client.getInputStream()));
  45. //create sender stream
  46. this.clientSender = new PrintWriter(this.client.getOutputStream());
  47.  
  48. //ask new client for unique name
  49. this.clientSender.println("Your name?");
  50. this.clientSender.flush();
  51. while(true)
  52. {
  53. //if client buffer is not empty --> asign name
  54. if(this.clientReceiver.ready())
  55. {
  56. this.name = this.clientReceiver.readLine();
  57. synchronized(names)
  58. {
  59. //synchronus access to client's names
  60. //if unique name is not empty and not equals blank chars --> accept name
  61. if(!this.name.trim().isEmpty() && !names.contains(name))
  62. {
  63. //add name to known names
  64. names.add(this.name);
  65.  
  66. //print welcome message
  67. this.clientSender.println("Welcome " + this.name + "!");
  68. this.clientSender.flush();
  69. break;
  70. }
  71. else
  72. {
  73. //if name in use or is empty --> ask for nem name
  74. this.clientSender.println("Name: " + this.name + "is already in use!\n" + "Your name?");
  75. this.clientSender.flush();
  76. }
  77. }
  78.  
  79. }
  80. }
  81. //send message to all known clients, that new client has joined chat
  82. for (PrintWriter sender : senders)
  83. {
  84. sender.println(this.name + "has joined");
  85. sender.flush();
  86. }
  87. //add client to list of known clients
  88. senders.add(this.clientSender);
  89.  
  90. //begin broadcasting
  91. String message = "";
  92. boolean exit = false;
  93. while(!exit)
  94. {
  95. //if client buffer is not empty --> broadcast message
  96. if(this.clientReceiver.ready())
  97. {
  98. message = this.clientReceiver.readLine();
  99. //format message
  100. if(!message.equalsIgnoreCase("end"))
  101. {
  102. message = "<" + this.name + ">:" + message;
  103. }
  104. else
  105. {
  106. //if message equals "end" --> close connection
  107. message = this.name + "has left";
  108. exit = true;
  109. }
  110. //send message to know hosts
  111. for(PrintWriter sender : senders)
  112. {
  113. if(sender != this.clientSender)
  114. {
  115. sender.println(message);
  116. sender.flush();
  117. }
  118. }
  119. }
  120. }
  121. //remove client from known hosts
  122. senders.remove(this.clientSender);
  123. names.remove(this.name);
  124. //close streams
  125. this.clientReceiver.close();
  126. this.clientSender.close();
  127. this.client.close();
  128. }
  129. catch(IOException e)
  130. {
  131. System.out.println(e);
  132. }
  133. }
  134. }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement