throughput_protocols.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #!/usr/bin/python3
  2. #
  3. import basic_protocols
  4. import logging
  5. import enum
  6. import time
  7. import socket
  8. #
  9. class ClientProtocol(basic_protocols.Protocol):
  10. def __init__(self, socket, total_bytes, send_buffer_len=None, use_acceleration=None, custom_data=b'', push_start_cb=None, push_done_cb=None):
  11. self.socket = socket
  12. self.total_bytes = total_bytes
  13. self.send_buffer_len = send_buffer_len
  14. self.use_acceleration = use_acceleration
  15. self.custom_data = custom_data
  16. self.push_start_cb = push_start_cb
  17. self.push_done_cb = push_done_cb
  18. #
  19. self.states = enum.Enum('CLIENT_CONN_STATES', 'READY_TO_BEGIN SEND_CUSTOM_DATA PUSH_DATA DONE')
  20. self.state = self.states.READY_TO_BEGIN
  21. #
  22. self.sub_protocol = None
  23. #
  24. def _run_iteration(self):
  25. if self.state is self.states.READY_TO_BEGIN:
  26. self.sub_protocol = basic_protocols.SendDataProtocol(self.socket, self.custom_data)
  27. self.state = self.states.SEND_CUSTOM_DATA
  28. #
  29. if self.state is self.states.SEND_CUSTOM_DATA:
  30. if self.sub_protocol.run():
  31. self.sub_protocol = basic_protocols.PushDataProtocol(self.socket, self.total_bytes,
  32. send_buffer_len=self.send_buffer_len,
  33. use_acceleration=self.use_acceleration,
  34. push_start_cb=self.push_start_cb,
  35. push_done_cb=self.push_done_cb)
  36. self.state = self.states.PUSH_DATA
  37. #
  38. #
  39. if self.state is self.states.PUSH_DATA:
  40. if self.sub_protocol.run():
  41. self.state = self.states.DONE
  42. #
  43. #
  44. if self.state is self.states.DONE:
  45. return True
  46. #
  47. return False
  48. #
  49. #
  50. class ServerProtocol(basic_protocols.Protocol):
  51. def __init__(self, socket, results_callback=None, use_acceleration=None):
  52. self.socket = socket
  53. self.results_callback = results_callback
  54. self.use_acceleration = use_acceleration
  55. #
  56. self.states = enum.Enum('SERVER_CONN_STATES', 'READY_TO_BEGIN RECV_CUSTOM_DATA PULL_DATA DONE')
  57. self.state = self.states.READY_TO_BEGIN
  58. #
  59. self.sub_protocol = None
  60. self.custom_data = None
  61. #
  62. def _run_iteration(self):
  63. if self.state is self.states.READY_TO_BEGIN:
  64. self.sub_protocol = basic_protocols.ReceiveDataProtocol(self.socket)
  65. self.state = self.states.RECV_CUSTOM_DATA
  66. #
  67. if self.state is self.states.RECV_CUSTOM_DATA:
  68. if self.sub_protocol.run():
  69. self.custom_data = self.sub_protocol.received_data
  70. #
  71. self.sub_protocol = basic_protocols.PullDataProtocol(self.socket, use_acceleration=self.use_acceleration)
  72. self.state = self.states.PULL_DATA
  73. #
  74. #
  75. if self.state is self.states.PULL_DATA:
  76. if self.sub_protocol.run():
  77. if self.results_callback:
  78. results = {}
  79. results['custom_data'] = self.custom_data
  80. results['data_size'] = self.sub_protocol.data_size
  81. results['time_of_first_byte'] = self.sub_protocol.time_of_first_byte
  82. results['time_of_last_byte'] = self.sub_protocol.time_of_last_byte
  83. results['transfer_rate'] = self.sub_protocol.calc_transfer_rate()
  84. results['deltas'] = self.sub_protocol.deltas
  85. #
  86. self.results_callback(results)
  87. #
  88. self.state = self.states.DONE
  89. #
  90. #
  91. if self.state is self.states.DONE:
  92. return True
  93. #
  94. return False
  95. #
  96. #