Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- import select
- import json
- import struct
- HEADER_LENGTH = 2
- class Connection:
- buf = ''
- def __init__(self, address='127.0.0.1', port=4000):
- self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self._read_buffer = ''
- self._packets = []
- self.address = address
- self.port = port
- self.connected = False
- self.read_delimiter = HEADER_LENGTH
- self.handle_read = self.handle_packet_header
- def handle_packet_header(self, data):
- #print 'handle_packet_header: ', data
- format = "!H"
- raw_packet = struct.unpack(format, data)
- #print raw_packet
- packet_length = int(raw_packet[0])
- self.read_delimiter = packet_length
- self.handle_read = self.handle_packet_content
- def handle_packet_content(self, data):
- #print 'handle_packet_content: ', data
- format = "!%ds" % self.read_delimiter
- raw_packet = struct.unpack(format, data)
- #print raw_packet
- self._packets.append(json.loads(raw_packet[0]))
- self.read_delimiter = HEADER_LENGTH
- self.handle_read = self.handle_packet_header
- def connect(self):
- self._sock.connect((self.address, self.port))
- self._sock.setblocking(0)
- self.connected = True
- def _recv(self):
- if self.connected:
- delimiter = self.read_delimiter
- if len(self._read_buffer) < delimiter:
- l = select.select([self._sock], [self._sock], [])
- for s in l[0]:
- data = s.recv(1024)
- self._read_buffer += data
- else:
- data = self._read_buffer[:delimiter]
- self._read_buffer = self._read_buffer[delimiter:]
- self.handle_read(data)
- def read(self):
- if self.connected:
- self._recv()
- if self._packets:
- return True
- else:
- return False
- def get_packet(self):
- return self._packets.pop()
- def send(self, msg):
- self._sock.send(msg.rstrip())
- def close(self):
- if self.connected:
- self._sock.close()
- self.connected = False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement