Network programming assignment for University
Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

154 řádky
4.2 KiB

  1. package net.hoo2.auth.vmodem;
  2. import java.util.Arrays;
  3. import ithakimodem.*;
  4. class Com {
  5. static final int SPEED_DEFAULT = 48000;
  6. static final int TIMEOUT_DEFAULT = 2000;
  7. static final String URL_DEFAULT = "ithaki";
  8. private Modem modem_;
  9. private int speed_;
  10. private int timeout_;
  11. Com () {
  12. modem_ = new Modem();
  13. speed_ = SPEED_DEFAULT;
  14. timeout_ = TIMEOUT_DEFAULT;
  15. modem_.setSpeed(speed_);
  16. modem_.setTimeout(timeout_);
  17. }
  18. Com (Log log, int speed, int timeout) {
  19. modem_ = new Modem();
  20. speed_ = speed;
  21. timeout_ = timeout;
  22. modem_.setSpeed(speed_);
  23. modem_.setTimeout(timeout_);
  24. }
  25. // get/set
  26. int timeout () { return timeout_; }
  27. void timeout (int timeout) {
  28. if (timeout_ != timeout) {
  29. timeout_ = timeout;
  30. modem_.setTimeout(timeout_);
  31. }
  32. }
  33. int speed () { return speed_; }
  34. void speed (int speed) {
  35. if (speed_ != speed) {
  36. speed_ = speed;
  37. modem_.setSpeed(speed_);
  38. }
  39. }
  40. boolean open (String url) { return modem_.open(url); }
  41. boolean open () { return modem_.open(URL_DEFAULT); }
  42. boolean close() { return modem_.close(); }
  43. Transaction request (Transaction data, byte[] code, byte[] begin, byte[] end, boolean bin) {
  44. int ch =0;
  45. boolean have_begin = (begin != null) ? false : true;
  46. boolean incoming = false;
  47. _clear (data.response, 0, data.response.length);
  48. if (code != null) {
  49. data.code = code;
  50. modem_.write(data.code);
  51. modem_.write((int)'\r');
  52. data.departure = System.currentTimeMillis();// - (long)((8*(data.code.length+1))*(1000.0/speed_));
  53. }
  54. data.size =0;
  55. do {
  56. if (data.size >= data.response.length) {
  57. data.size =0;
  58. return data;
  59. }
  60. try {
  61. ch = modem_.read();
  62. }
  63. catch (Exception e) {
  64. System.err.println (e.getMessage());
  65. data.size =0;
  66. return data;
  67. }
  68. if (!incoming) {
  69. incoming = true;
  70. data.arrival = System.currentTimeMillis();// - (long)(8*(1000.0/speed_));
  71. }
  72. data.response [data.size++] = (byte)ch;
  73. if (!have_begin && (detect(data.response, begin, data.size) != -1)) {
  74. _clear(data.response, 0, data.size);
  75. data.size = _copy (data.response, begin);
  76. have_begin = true;
  77. }
  78. } while (ch != -1 &&
  79. (!have_begin ||
  80. ( (bin || (detect (data.response, "\r\n\n\n".getBytes(), data.size) == -1))
  81. && (bin || (detect (data.response, "NO CARRIER".getBytes(), data.size) == -1))
  82. && (detect (data.response, end, data.size) == -1)
  83. )
  84. )
  85. );
  86. return data;
  87. }
  88. static int detect (byte[] data, byte[] pattern, int max) {
  89. if (pattern != null) {
  90. for (int i =0 ; i<max && i<data.length - pattern.length; ++i) {
  91. boolean detected = true;
  92. for (int j=0 ; j<pattern.length ; ++j) {
  93. if (data[i+j] != pattern[j]) {
  94. detected = false;
  95. break;
  96. }
  97. }
  98. if (detected)
  99. return i;
  100. }
  101. }
  102. return -1;
  103. }
  104. private void _clear (byte[] buffer, int begin, int end) {
  105. for (int i=begin ; i<end && i<buffer.length ; ++i)
  106. buffer[i] = 0;
  107. }
  108. private int _copy (byte[] dest, byte[] src) {
  109. if (dest.length >= src.length) {
  110. for (int i=0 ; i<src.length ; ++i)
  111. dest[i] = src[i];
  112. return src.length;
  113. }
  114. return 0;
  115. }
  116. }
  117. class Transaction {
  118. byte[] code;
  119. byte[] response;
  120. long departure;
  121. long arrival;
  122. int size;
  123. Transaction (byte[] code, byte[] response) {
  124. this.code = code;
  125. this.response = response;
  126. departure = arrival = 0;
  127. size = 0;
  128. }
  129. byte[] getResponse() {
  130. return Arrays.copyOf(response, size);
  131. }
  132. }