Esempio n. 1
0
    def recieveVideo(self):
        while self.connected:
            try:
                data, addr = self.client.recvfrom(self.bufferSize)
                datapack = Netpack(datapacket=data)
                self.lastReceived = time()

                if datapack.PackType == PackType.ClientData:
                    datapack = Videopack(datapacket=data)
                    if self.chunkedFrames.get(datapack.head, None) is None:
                        self.chunkedFrames[datapack.head] = {'currId': 0}
                        self.queryForName(datapack.head)
                    self.processFrameChunk(datapack)

                    if self.clientNames.get(datapack.head, None) is None:
                        self.queryForName(datapack.head)

                elif datapack.PackType == PackType.KeepAlive and datapack.data.decode(
                ) == PINGME:
                    outpack = Netpack(packType=PackType.KeepAlive,
                                      data=OK.encode('UTF-8'))
                    self.client.sendto(outpack.out(), self.server)

                elif datapack.PackType == PackType.NameQuery:
                    query = datapack.data.decode(encoding='UTF-8')
                    char = int(query.split(':')[0])
                    name = query.split(':')[1]
                    self.clientNames[char] = name

            except timeout:
                self.connected = False
                print('Lost connection to server!')
Esempio n. 2
0
    def recieveAudio(self):
        while self.connected:
            try:
                data, addr = self.client.recvfrom(self.bufferSize)
                datapack = Netpack(datapacket=data)
                self.lastReceived = time()
                self.updateIsSpeaking()

                if datapack.PackType == PackType.ClientData:
                    char = datapack.head
                    if self.streamsOut.get(char, None) is None:
                        self.addOutputStream(char)
                        self.queryForName(char)
                    #print(self.streamsOut[char].get_write_available())
                    self.streamsOut[char].write(datapack.data)

                    if self.clientNames.get(char, None) is None:
                        self.queryForName(char)

                elif datapack.PackType == PackType.KeepAlive and datapack.data.decode(
                ) == PINGME:
                    outpack = Netpack(packType=PackType.KeepAlive,
                                      data=OK.encode('UTF-8'))
                    self.client.sendto(outpack.out(), self.server)

                elif datapack.PackType == PackType.NameQuery:
                    query = datapack.data.decode(encoding='UTF-8')
                    char = int(query.split(':')[0])
                    name = query.split(':')[1]
                    self.clientNames[char] = name

            except timeout:
                self.connected = False
                print('Lost connection to server!')
Esempio n. 3
0
 def sendVideo(self):
     while self.connected:
         if time() - self.lastReceived >= START_PINGING:
             pingpack = Netpack(packType=PackType.KeepAlive,
                                data=PINGME.encode('UTF-8'))
             self.client.sendto(pingpack.out(), self.server)
         if (time() - self.lastSent) > (1 / self.fps):
             frameBytes = self.cam.getFrame()
             self.currentFrames[ME] = cv2.imdecode(
                 np.fromstring(frameBytes, np.uint8), cv2.IMREAD_COLOR)
             self.currentFrames[ME] = cv2.cvtColor(self.currentFrames[ME],
                                                   cv2.COLOR_BGR2RGB)
             self.sendFrameChunks(frameBytes)
             self.lastSent = time()
Esempio n. 4
0
    def connectToServer(self):
        if self.connected:
            return True

        datapack = Netpack(packType=PackType.Handshake,
                           data=self.name.encode(encoding='UTF-8'))
        self.client.sendto(datapack.out(), self.server)

        data, addr = self.client.recvfrom(self.bufferSize)
        datapack = Netpack(datapacket=data)

        if (addr == self.server and datapack.PackType == PackType.Handshake
                and datapack.data.decode('UTF-8') == OK):
            print('Connected to server successfully!')
            self.connected = True
        return self.connected
Esempio n. 5
0
    def checkConnections(self):
        currTime = time()
        disconnected = []

        for addr, lastTime in self.timeOfLastMessage.items():
            if currTime - lastTime > MediaServer.CLIENT_CONNECTION_TIMEOUT:
                disconnected.append(addr)

            elif ((currTime - lastTime >= MediaServer.START_PINGING)
                  and self.missedPings[addr] < MediaServer.MAX_PINGS):
                datapack = Netpack(packType=PackType.KeepAlive,
                                   data=PINGME.encode(encoding='UTF-8'))
                self.server.sendto(datapack.out(), addr)
                self.missedPings[addr] += 1

        for addr in disconnected:
            self.disconnectClient(addr)
Esempio n. 6
0
 def receiveData(self):
     while True:
         try:
             data, addr = self.server.recvfrom(self.bufferSize)
             datapack = Netpack(datapacket=data)
             self.handlePacket(datapack, addr)
         except timeout:
             pass
         self.checkConnections()
Esempio n. 7
0
    def handlePacket(self, datapack, addr):
        if self.clients.get(addr, None) is None:
            try:
                if datapack.PackType != PackType.Handshake:
                    return

                name = datapack.data.decode(encoding='UTF-8')

                self.clients[addr] = name
                self.clientCharId[addr] = len(self.clients)
                self.timeOfLastMessage[addr] = time()
                self.missedPings[addr] = 0

                print('{} has connected to {} on {}!'.format(
                    name, self.tag, addr))
                datapack = Netpack(packType=PackType.Handshake,
                                   data=OK.encode(encoding='UTF-8'))
                self.server.sendto(datapack.out(), addr)
            except:
                pass
            return

        self.timeOfLastMessage[addr] = time()
        if datapack.PackType == PackType.ClientData:
            self.broadcastData(addr, datapack)
        elif datapack.PackType == PackType.KeepAlive:
            self.missedPings[addr] = 0
            if datapack.data.decode() == PINGME:
                pingpack = Netpack(packType=PackType.KeepAlive,
                                   data=OK.encode(encoding='UTF-8'))
                self.server.sendto(pingpack.out(), addr)
        elif datapack.PackType == PackType.NameQuery:
            char = int(datapack.data.decode(encoding='UTF-8'))
            addrQuery = {v: k for k, v in self.clientCharId.items()}[char]
            namepack = Netpack(
                packType=PackType.NameQuery,
                data=(str(char) + ':' +
                      self.clients[addrQuery]).encode(encoding='UTF-8'))
            self.server.sendto(namepack.out(), addr)
Esempio n. 8
0
    def sendAudio(self):
        while self.connected:
            if time() - self.lastReceived >= START_PINGING:
                pingpack = Netpack(packType=PackType.KeepAlive,
                                   data=PINGME.encode('UTF-8'))
                self.client.sendto(pingpack.out(), self.server)

            data = self.streamIn.read(self.audioSettings['CHUNK'],
                                      exception_on_overflow=False)
            vol = max(array('h', data))
            if vol > self.audioSettings['THRESHOLD']:
                datapack = Netpack(packType=PackType.ClientData, data=data)
                self.client.sendto(datapack.out(), self.server)
                self.isSpeaking[ME] = True
            else:
                self.isSpeaking[ME] = False
Esempio n. 9
0
 def queryForName(self, clientNum):
     outpack = Netpack(packType=PackType.NameQuery,
                       data=str(clientNum).encode(encoding='UTF-8'))
     self.client.sendto(outpack.out(), self.server)