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!')
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!')
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()
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
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)
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()
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)
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
def queryForName(self, clientNum): outpack = Netpack(packType=PackType.NameQuery, data=str(clientNum).encode(encoding='UTF-8')) self.client.sendto(outpack.out(), self.server)