120 lines
3.5 KiB
Python
120 lines
3.5 KiB
Python
# !/usr/bin/env python
|
|
# -*- coding:utf-8 -*-
|
|
|
|
import threading
|
|
import socket
|
|
import time
|
|
import struct
|
|
import time
|
|
|
|
from .presenter_datatype import *
|
|
|
|
|
|
|
|
class AgentSocket(object):
|
|
def __init__(self, server_ip, port):
|
|
self._server_address = (server_ip, port)
|
|
self._sock_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
|
|
|
def connect(self):
|
|
ret = 0
|
|
for i in range(0,5):
|
|
ret = self._sock_client.connect_ex(self._server_address)
|
|
if ret == 0:
|
|
break
|
|
time.sleep(0.2)
|
|
return ret
|
|
|
|
def _read_socket(self, read_len):
|
|
has_read_len = 0
|
|
read_buf = b''
|
|
total_buf = b''
|
|
|
|
while has_read_len != read_len:
|
|
try:
|
|
read_buf = self._sock_client.recv(read_len - has_read_len)
|
|
except socket.error:
|
|
print("ERROR:Read socket failed")
|
|
return False, None
|
|
if read_buf == b'':
|
|
return False, None
|
|
total_buf += read_buf
|
|
has_read_len = len(total_buf)
|
|
|
|
return True, total_buf
|
|
|
|
def _read_msg_head(self, read_len):
|
|
ret, msg_head = self._read_socket(read_len)
|
|
#print("msg head data is :", msg_head)
|
|
if not ret:
|
|
print("ERROR:socket receive msg head null")
|
|
return None, None
|
|
|
|
# in Struct(), 'I' is unsigned int, 'B' is unsigned char
|
|
msg_head_data = struct.Struct('IB')
|
|
(msg_total_len, msg_name_len) = msg_head_data.unpack(msg_head)
|
|
msg_total_len = socket.ntohl(msg_total_len)
|
|
#print("msg total length is :", msg_total_len)
|
|
#print("msg name is :", msg_name_len)
|
|
return msg_total_len, msg_name_len
|
|
|
|
def _read_msg_name(self, msg_name_len):
|
|
ret, msg_name = self._read_socket(msg_name_len)
|
|
#print("direct msg name is :", msg_name)
|
|
if not ret:
|
|
print("ERROR:socket receive msg name null")
|
|
return False, None
|
|
try:
|
|
msg_name = msg_name.decode("utf-8")
|
|
#print("decode msg name is :", msg_name)
|
|
except Exception as e:
|
|
print("ERROR:msg name decode to utf-8 error")
|
|
return False, None
|
|
|
|
return True, msg_name
|
|
|
|
def _read_msg_body(self, msg_body_len):
|
|
#print("msg body length is :", msg_body_len)
|
|
ret, msg_body = self._read_socket(msg_body_len)
|
|
if not ret:
|
|
print("ERROR:socket receive msg body null")
|
|
return False, None
|
|
return True, msg_body
|
|
|
|
def recv_msg(self):
|
|
# Step1: read msg head
|
|
msg_total_len, msg_name_len = self._read_msg_head(5)
|
|
if msg_total_len is None:
|
|
print("ERROR:msg total len is None.")
|
|
return None
|
|
|
|
# Step2: read msg name
|
|
ret, msg_name = self._read_msg_name(msg_name_len)
|
|
if not ret:
|
|
return None
|
|
|
|
# Step3: read msg body
|
|
msg_body_len = msg_total_len - 5 - msg_name_len
|
|
if msg_body_len < 0:
|
|
print("ERROR:msg total len is 0")
|
|
return None
|
|
ret, msg_body = self._read_msg_body(msg_body_len)
|
|
if not ret:
|
|
return None
|
|
|
|
return msg_name, msg_body
|
|
|
|
|
|
def send_msg(self, data):
|
|
try:
|
|
self._sock_client.sendall(data)
|
|
except Exception as e:
|
|
print("ERROR:Send msg failed")
|
|
return 1
|
|
return 0
|
|
|
|
def close(self):
|
|
self._sock_client.shutdown(socket.SHUT_RDWR)
|
|
self._sock_client.close()
|