tcp_server.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import socket
  2. import threading
  3. import json
  4. class TcpServer:
  5. def __init__(self):
  6. self.port=2233#设置端口
  7. self.HEAD_LEN=8
  8. self.tcpServerSocket=socket.socket()#创建socket对象
  9. hostname= socket.gethostname()#获取本地主机名
  10. sysinfo = socket.gethostbyname_ex(hostname)
  11. hostip=sysinfo[2][2]
  12. self.tcpServerSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)#让端口可以复用
  13. self.tcpServerSocket.bind((hostip,self.port))#将地址与套接字绑定,且套接字要求是从未被绑定过的
  14. self.tcpServerSocket.listen(5)#代办事件中排队等待connect的最大数目
  15. def set_receive_listener(self,receive_listener):
  16. self.receive_listener = receive_listener
  17. def server(self):
  18. while True:
  19. print("等待连接")
  20. self.clientSocket, addr = self.tcpServerSocket.accept()
  21. print ('连接地址:', addr)
  22. if self.connected_listener:
  23. self.connected_listener()
  24. while True:
  25. try:
  26. head_data=self.clientSocket.recv(self.HEAD_LEN)
  27. if not len(head_data)==8:
  28. print("bad package!head_data len:",head_data)
  29. self.restart()
  30. return
  31. body_len = self.get_length_from_head_data(head_data)
  32. body_data = self.clientSocket.recv(body_len)
  33. if not body_len==len(body_data):
  34. print("bad package!body_len:",body_len)
  35. self.restart()
  36. return
  37. data_type = self.get_type_from_head_data(head_data)
  38. if data_type == 1:#test/json data
  39. text = body_data.decode()
  40. print(text)
  41. if not text:
  42. break
  43. if self.receive_listener:
  44. self.receive_listener(text)
  45. elif data_type == 2:#image data
  46. pass
  47. except ConnectionResetError:
  48. print("ConnectionResetError!")
  49. self.restart()
  50. return
  51. self.clientSocket.close() # 关闭连接
  52. self.tcpServerSocket.close()
  53. def get_length_from_head_data(self,head_data):
  54. if(not len(head_data)==8):
  55. return
  56. ch1 = head_data[4] & 0x00FF;
  57. ch2 = head_data[5] & 0x00FF;
  58. ch3 = head_data[6] & 0x00FF;
  59. ch4 = head_data[7] & 0x00FF;
  60. return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
  61. def get_type_from_head_data(self,head_data):
  62. if(not len(head_data)==8):
  63. return
  64. ch1 = head_data[0] & 0x00FF;
  65. ch2 = head_data[1] & 0x00FF;
  66. ch3 = head_data[2] & 0x00FF;
  67. ch4 = head_data[3] & 0x00FF;
  68. return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
  69. def start(self):
  70. self.server_threading = threading.Thread(target=self.server, args=())
  71. self.server_threading.start()
  72. def restart(self):
  73. self.start()
  74. def send_data(self, data):
  75. try:
  76. self.clientSocket.send(data)
  77. except ConnectionResetError:
  78. print("ConnectionResetError!")
  79. self.restart()
  80. def send_img(self, bytes_data):
  81. data = self.wrapper_data(2,bytes_data)
  82. self.send_data(data)
  83. def send_text(self, text):
  84. data = self.wrapper_data(1,text.encode())
  85. self.send_data(data)
  86. def wrapper_data(self,data_type,body_data):
  87. print("data_type:",data_type)
  88. print("body_data len:",len(body_data))
  89. type_bytes=data_type.to_bytes(4,'big')
  90. print("type_bytes:",type_bytes)
  91. body_len = len(body_data)
  92. body_len_bytes = body_len.to_bytes(4,'big')
  93. print("body_len_bytes:",body_len_bytes)
  94. head_data = type_bytes + body_len_bytes
  95. print("head_data:",head_data)
  96. data = head_data+body_data
  97. return data