<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def pull(self):

 """This coroutine handles the server connection, does a basic parse on
 the received messages and put them in a queue named events.
 The controllers pull method will take the messages from that queue.
 """

        self.sock = sockets.Socket()
        self.sock.settimeout(self.sock_timo)
        yield events.AddCoro(self.monitor)
        while not self.connected:
            try:
                addr = self.server.split(':')
                if len(addr) < 2:
                    addr.append(6667)
                else:
                    addr[1] = int(addr[1])
                yield self.events.put(('', 'CONNECTING', ''), timeout=self.sock_timo)
                yield self.sock.connect(tuple(addr))
                self.connected = True
            except events.OperationTimeout, e:
                yield self.events.put(('', 'CONNECT_TIMEOUT', str(e)), timeout=self.sock_timo)
                yield events.Sleep(self.reconnect_interval)

        yield self.events.put_nowait(('', 'CONNECTED', ''))
        fobj = self.sock.makefile()
        while 1:
            try:
                line = yield fobj.readline(8192)
                prefix, command, params = parsemsg(line.rstrip('\r\n'))
                if command in numeric_events:
                    command = numeric_events[command].upper()
                print 'PULLME:', (prefix, command, params)
                yield self.events.put((prefix, command, params), timeout=self.sock_timo)
            except Exception, e:
                yield self.events.put(('', 'ERROR', str(e)), timeout=self.sock_timo)
                break