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.

Client.java 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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.Socket;
  7. import java.util.Observable;
  8. import java.util.Observer;
  9. import java.util.logging.Level;
  10. import java.util.logging.Logger;
  11. /**
  12. * TCP Client
  13. *
  14. * @author marian
  15. */
  16. public class Client extends Observable implements Runnable, Transceiver
  17. {
  18. private Socket socket;
  19. private ObjectInputStream reader;
  20. private ObjectOutputStream writer;
  21. private boolean ready;
  22. private Thread thd;
  23. private String ip;
  24. private int port;
  25. private static Logger logger = OhmLogger.getLogger();
  26. /**
  27. * Constructor, initialize variables
  28. * @param ip IP to connect to
  29. * @param port Port of remote server
  30. */
  31. public Client(String ip, int port)
  32. {
  33. this.ip = ip;
  34. this.port = port;
  35. this.socket = null;
  36. this.reader = null;
  37. this.writer = null;
  38. this.ready = false;
  39. this.thd = null;
  40. }
  41. /**
  42. * Init client thread, if not already done
  43. */
  44. @Override
  45. public void init()
  46. {
  47. if (thd == null) {
  48. thd = new Thread(this);
  49. thd.start();
  50. }
  51. }
  52. /**
  53. * Add observer to client
  54. * @param o Observer to add
  55. */
  56. @Override
  57. public void registerObserver(Observer o)
  58. {
  59. this.addObserver(o);
  60. }
  61. /**
  62. * Run the client in thread.
  63. */
  64. @Override
  65. public void run()
  66. {
  67. logger.info("Running client...");
  68. while (true)
  69. {
  70. if (socket == null) {
  71. try {
  72. socket = new Socket(ip, port);
  73. logger.info("Connected to server");
  74. } catch (IOException e) {
  75. logger.severe(e.getMessage());
  76. socket = null;
  77. try {
  78. Thread.sleep(1000);
  79. } catch (InterruptedException ex) {
  80. Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
  81. }
  82. continue;
  83. }
  84. try {
  85. reader = new ObjectInputStream(socket.getInputStream());
  86. } catch (IOException e) {
  87. logger.severe(e.toString());
  88. return;
  89. }
  90. try {
  91. writer = new ObjectOutputStream(socket.getOutputStream());
  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 server
  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. }