No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ReceiveThread.java 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package chat;
  2. import java.io.EOFException;
  3. import java.net.SocketException;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.net.Socket;
  8. import java.util.Collections;
  9. import java.util.List;
  10. import javax.swing.JTextArea;
  11. class ReceiveThread extends Thread {
  12. User user;
  13. Socket socket;
  14. JTextArea displayArea;
  15. JTextArea knownUsersPanel;
  16. Boolean isOutdoor;
  17. List<User> known_users;
  18. List<User> known_outdoor_users;
  19. List<Socket> dest_sockets;
  20. List<Socket> outdoor_dest_sockets;
  21. ReceiveThread(User in_user, Socket in_socket, JTextArea in_displayArea, List<User> in_known_users, List<User> in_known_outdoor_users,
  22. JTextArea in_knownUsersPanel, List<Socket> in_dest_sockets, List<Socket> in_outdoor_dest_sockets, Boolean in_isOutdoor)
  23. {
  24. user = in_user;
  25. socket = in_socket;
  26. displayArea = in_displayArea;
  27. knownUsersPanel = in_knownUsersPanel;
  28. known_users = in_known_users;
  29. known_outdoor_users = in_known_outdoor_users;
  30. dest_sockets = in_dest_sockets;
  31. outdoor_dest_sockets = in_outdoor_dest_sockets;
  32. isOutdoor = in_isOutdoor;
  33. }
  34. public void run()
  35. {
  36. boolean exit = false;
  37. try
  38. {
  39. while(!exit)
  40. {
  41. ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
  42. Notification notif = (Notification) in.readObject();
  43. if(!(notif.getAuthor().equals(user)) && !notif.isRedirected())
  44. {
  45. notif.setRedirected(true);
  46. for(Socket s:outdoor_dest_sockets)
  47. {
  48. try
  49. {
  50. ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
  51. out.writeObject(notif);
  52. }
  53. catch(IOException e){}
  54. }
  55. notif.setRedirected(false);
  56. }
  57. if(isOutdoor)
  58. {
  59. notif.setRedirected(true);
  60. for(Socket s:dest_sockets)
  61. {
  62. try
  63. {
  64. ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
  65. out.writeObject(notif);
  66. }
  67. catch(IOException e){}
  68. }
  69. notif.setRedirected(false);
  70. }
  71. else
  72. {
  73. if(notif instanceof Message)
  74. {
  75. Message m = (Message) notif;
  76. displayArea.append(m.getAuthor().getName() + " : " + m.getText() + "\n");
  77. }
  78. else if (notif instanceof DisconnectNotification)
  79. {
  80. DisconnectNotification dn = (DisconnectNotification) notif;
  81. displayArea.append(dn.getAuthor().getName() + " has left the chat.\n");
  82. known_users.remove(dn.getAuthor());
  83. known_outdoor_users.remove(dn.getAuthor());
  84. if(!dn.isRedirected() && !dn.getAuthor().equals(user))
  85. {
  86. exit = true;
  87. socket.close();
  88. if(!isOutdoor)
  89. dest_sockets.remove(socket);
  90. else
  91. outdoor_dest_sockets.remove(socket);
  92. }
  93. }
  94. else if (notif instanceof ConnectNotification)
  95. {
  96. ConnectNotification cn = (ConnectNotification) notif;
  97. displayArea.append(cn.getAuthor().getName() + " has joined the chat.\n");
  98. if(cn.isOutdoor())
  99. {
  100. if(!known_outdoor_users.contains(cn.getAuthor()))
  101. {
  102. known_outdoor_users.add(cn.getAuthor());
  103. Collections.sort(known_outdoor_users);
  104. }
  105. }
  106. else
  107. {
  108. if(!known_users.contains(cn.getAuthor()))
  109. {
  110. known_users.add(cn.getAuthor());
  111. Collections.sort(known_users);
  112. }
  113. }
  114. }
  115. knownUsersPanel.setText("");
  116. knownUsersPanel.append("Indoor users:\n");
  117. for(User a:known_users)
  118. {
  119. knownUsersPanel.append(" " + a.getName() + " \n");
  120. }
  121. knownUsersPanel.append("\nOutdoor users:\n");
  122. for(User a:known_outdoor_users)
  123. {
  124. knownUsersPanel.append(" " + a.getName() + " \n");
  125. }
  126. displayArea.setCaretPosition(displayArea.getDocument().getLength());
  127. }
  128. }
  129. }
  130. catch(EOFException e) {}
  131. catch(SocketException e)
  132. {
  133. if(!isOutdoor)
  134. dest_sockets.remove(socket);
  135. else
  136. outdoor_dest_sockets.remove(socket);
  137. }
  138. catch(Exception e)
  139. {
  140. e.printStackTrace();
  141. }
  142. }
  143. }