Advertisement
Guest User

Untitled

a guest
Jul 20th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.31 KB | None | 0 0
  1.  
  2. import socket
  3. import select
  4. import json
  5. import struct
  6.  
  7. HEADER_LENGTH = 2
  8.  
  9. class Connection:
  10.     buf = ''
  11.        
  12.     def __init__(self, address='127.0.0.1', port=4000):
  13.         self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  14.         self._read_buffer = ''
  15.         self._packets = []
  16.         self.address = address
  17.         self.port = port
  18.         self.connected = False
  19.         self.read_delimiter = HEADER_LENGTH
  20.         self.handle_read = self.handle_packet_header
  21.        
  22.        
  23.     def handle_packet_header(self, data):
  24.         #print 'handle_packet_header: ', data
  25.         format = "!H"
  26.         raw_packet = struct.unpack(format, data)
  27.         #print raw_packet
  28.         packet_length = int(raw_packet[0])
  29.        
  30.         self.read_delimiter = packet_length
  31.         self.handle_read = self.handle_packet_content
  32.        
  33.     def handle_packet_content(self, data):
  34.         #print 'handle_packet_content: ', data
  35.         format = "!%ds" % self.read_delimiter
  36.         raw_packet = struct.unpack(format, data)
  37.         #print raw_packet
  38.         self._packets.append(json.loads(raw_packet[0]))
  39.         self.read_delimiter = HEADER_LENGTH
  40.         self.handle_read = self.handle_packet_header
  41.    
  42.     def connect(self):
  43.         self._sock.connect((self.address, self.port))
  44.         self._sock.setblocking(0)
  45.         self.connected = True
  46.  
  47.     def _recv(self):
  48.         if self.connected:
  49.             delimiter = self.read_delimiter
  50.             if len(self._read_buffer) < delimiter:
  51.                 l = select.select([self._sock], [self._sock], [])
  52.                 for s in l[0]:
  53.                     data = s.recv(1024)
  54.                     self._read_buffer += data
  55.             else:
  56.                 data = self._read_buffer[:delimiter]
  57.                 self._read_buffer = self._read_buffer[delimiter:]
  58.                 self.handle_read(data)
  59.  
  60.     def read(self):
  61.         if self.connected:
  62.             self._recv()
  63.             if self._packets:
  64.                 return True
  65.             else:
  66.                 return False
  67.        
  68.     def get_packet(self):
  69.         return self._packets.pop()
  70.    
  71.     def send(self, msg):
  72.         self._sock.send(msg.rstrip())
  73.  
  74.     def close(self):
  75.         if self.connected:
  76.             self._sock.close()
  77.             self.connected = False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement