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.

Server.java 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package grafikchat.model;
  2. import grafikchat.ohmlogger.OhmLogger;
  3. import java.io.IOException;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8. import java.util.Observable;
  9. import java.util.Observer;
  10. import java.util.logging.Logger;
  11. /**
  12. * TCP Server
  13. *
  14. * @author marian
  15. */
  16. public class Server extends Observable implements Runnable, Transceiver
  17. {
  18. private int port;
  19. private ServerSocket server;
  20. private Socket client;
  21. private static Logger logger = OhmLogger.getLogger();
  22. private ObjectInputStream reader;
  23. private ObjectOutputStream writer;
  24. private volatile boolean ready;
  25. private Thread thd;
  26. /**
  27. * Constructor, initialize variables
  28. * @param port Port to listen on
  29. */
  30. public Server(int port)
  31. {
  32. this.port = port;
  33. this.server = null;
  34. this.client = null;
  35. this.reader = null;
  36. this.writer = null;
  37. this.ready = false;
  38. this.thd = null;
  39. }
  40. /**
  41. * Init server if not already done
  42. */
  43. @Override
  44. public void init()
  45. {
  46. if (thd == null) {
  47. thd = new Thread(this);
  48. thd.start();
  49. }
  50. }
  51. /**
  52. * Add observer to server
  53. * @param o Observer to add
  54. */
  55. @Override
  56. public void registerObserver(Observer o)
  57. {
  58. this.addObserver(o);
  59. }
  60. /**
  61. * Run server in thread
  62. */
  63. @Override
  64. public void run()
  65. {
  66. logger.info("Running server...");
  67. while (true)
  68. {
  69. if (server == null) {
  70. try {
  71. server = new ServerSocket(port);
  72. } catch (IOException e) {
  73. logger.severe(e.toString());
  74. return;
  75. }
  76. logger.info("Waiting for client to connect");
  77. try {
  78. client = server.accept();
  79. } catch (IOException e) {
  80. logger.severe(e.toString());
  81. return;
  82. }
  83. logger.info("Client connected");
  84. try {
  85. writer = new ObjectOutputStream(client.getOutputStream());
  86. } catch (IOException e) {
  87. logger.severe(e.toString());
  88. return;
  89. }
  90. try {
  91. reader = new ObjectInputStream(client.getInputStream());
  92. } catch (IOException e) {
  93. logger.severe(e.toString());
  94. return;
  95. }
  96. ready = true;
  97. }
  98. if (ready) {
  99. try {
  100. //logger.info("Waiting for message");
  101. Object o = reader.readObject();
  102. if (o == null) {
  103. logger.warning("Reached end of stream");
  104. ready = false;
  105. continue;
  106. }
  107. this.setChanged();
  108. this.notifyObservers(o);
  109. } catch (ClassNotFoundException | IOException e) {
  110. logger.severe(e.toString());
  111. return;
  112. }
  113. }
  114. }
  115. }
  116. /**
  117. * Send message to client
  118. * @param d TransceiverData to transmit
  119. */
  120. @Override
  121. public void sendMessage(TransceiverData d)
  122. {
  123. if (ready) {
  124. try {
  125. writer.writeObject(d);
  126. } catch (IOException e) {
  127. logger.severe(e.toString());
  128. }
  129. } else {
  130. logger.warning("Server not ready to send message. Connect first");
  131. }
  132. }
  133. }