def handleData(data): room = room_pb2.Room() room.ParseFromString(data) resRoom = room_pb2.Room() if room.type == Types.LOGIN.value: person = room.persons[0] username = person.name password = person.password if not userMgr.checkUser({'name':username, 'password':password}): resRoom.type = Types.SUCC.value print('user: '******' login!') else: resRoom.type = Types.FAILED.value print('user: '******' login failed') elif room.type == Types.REGIST.value: person = room.persons[0] username = person.name password = person.password if not userMgr.addUser({'name':username, 'password':password}): resRoom.type = Types.SUCC.value else: resRoom.type = Types.FAILED.value elif room.type == Types.NEWROOM.value: pass return resRoom.SerializeToString()
def clientProcess(): client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) epoll = select.epoll() client_socket.setblocking(0) epoll.register(client_socket.fileno(), select.EPOLLIN) serveraddr = ('127.0.0.1', 6666) lastseq = 0 needseq = 1 unackseq = [] recvseq = [] t = 0 flag = Types.LOGIN.value username = '******' password = '******' room = room_pb2.Room() room.type = flag p1 = room.persons.add() p1.name = username p1.password = password data = room.SerializeToString() client_socket.sendto(data, serveraddr) roomIn = room_pb2.Room() roomIn.id = 11 roomIn.type = Types.JOINROOM.value p1 = roomIn.persons.add() p1.name = username data = roomIn.SerializeToString() client_socket.sendto(data, serveraddr) seq = 0 try: while True: if lastseq == seq: t = time.clock() roomGame = room_pb2.Room() roomGame.type = Types.GAMEDATA.value roomGame.seq = seq + 1 seq += 1 # roomGame.rotation = random.random() * 360 # roomGame.direction = int(random.random() * 3) data = roomGame.SerializeToString() client_socket.sendto(data, serveraddr) print('send seq: ' + str(seq) + ' len ' + str(len(data))) t = time.clock() events = epoll.poll(1) for fileno, event in events: if fileno == client_socket.fileno(): data, addr = client_socket.recvfrom(1024) room = room_pb2.Room() room.ParseFromString(data) if room.type == Types.ACK.value: lastseq = room.seq response = handleData(data, addr, lastseq, needseq, unackseq, recvseq, client_socket) # client_socket.sendto(data, addr) print('ttl: ' + str(time.clock() - t) + ' secends') finally: print('error') epoll.unregister(client_socket.fileno()) epoll.close() client_socket.close()
def handleData(data): room = room_pb2.Room() room.ParseFromString(data) resRoom = room_pb2.Room() if room.id == TYPE_LOGIN: person = room.persons[0] username = person.name password = person.password print('user: '******' try to login!') # rwl.readAcquire() # if users.get(username): # if users[username]['password'] == password: # print('password correct') # resRoom.id = 200 # else: # print('password incorrect') # resRoom.id = 303 # else: # print('user not exists') # resRoom.id = 404 # rwl.readRelease() if not userMgr.checkUser({'name': username, 'password': password}): resRoom.id = 200 print('login succ') print(userMgr.getAllUsers()) else: resRoom.id = 303 print('login failed') elif room.id == TYPE_REGIST: person = room.persons[0] username = person.name password = person.password # dict version # rwl.readAcquire() # if users.get(username): # print('user exists') # resRoom.id = 404 # else: # rwl.readRelease() # rwl.writeAcquire() # users[username] = {'username': username, 'password': password} # rwl.writeRelease() # resRoom.id = 200 # sql version if not userMgr.addUser({'name': username, 'password': password}): resRoom.id = 200 else: print('user exists') resRoom.id = 404 return resRoom.SerializeToString()
def handleData(data, addr=None): room = room_pb2.Room() room.ParseFromString(data) resRoom = room_pb2.Room() if room.type == Types.JOINROOM.value: person = room.persons[0] roomslock.acquire() if not rooms[room.id]['person'].get(person.name): roomi = rooms[room.id] roomi['person'][person.name] = dict() roomi['person'][person.name]['addr'] = addr roomi['person'][person.name]['action'] = [(0.0, 0)] roomi['person'][person.name]['position'] = (0.0, 0.0) roomi['person'][person.name]['rotation'] = 0.0 rooms[room.id] = roomi personsroom[person.name] = room.id addrperson[addr] = person.name print('room ' + str(room.id) + ' add person ' + person.name) roomslock.release() elif room.type == Types.GAMEDATA.value: print('recv seq ' + str(room.seq) + ' len ' + str(len(data))) personname = addrperson[addr] roomid = personsroom[personname] roomslock.acquire() if len(rooms[roomid]['person'][personname]['action']) == room.seq: roomi = rooms[roomid] roomi['person'][personname]['action'].append((room.rotation, room.direction)) roomi['person'][personname]['rotation'] = (room.rotation + roomi['person'][personname]['rotation']) % (math.pi * 2) roomi['person'][personname]['rotation'] = roomi['person'][personname]['rotation'] * room.direction rooms[roomid] = roomi else: # rooms[roomid]['person'][personname]['action'][room.seq] = (room.rotation, room.direction) pass roomslock.release() roomres = room_pb2.Room() roomres.type = Types.ACK.value roomres.seq = room.seq server_socket.sendto(roomres.SerializeToString(), addr) print('send seq ' + str(room.seq) + ' ack to ' + str(addr) ) elif room.type == Types.ACK.value: seqs = unackseq[addr] for s in seqs: if s <= room.seq: seqs.remove(s) unackseq[addr] = seqs print('recv seq ' + str(room.seq) + ' ack') return None elif room.type == Types.PING.value: if addr in unackaddrs: unackaddrs.pop(addr) return resRoom.SerializeToString()
def conn(lastseq, needseq, recvseq, unackseq, t, positoin): while True: seq = 0 k = 10 while True: if needseq.value >= seq - k: # and unackseq[0] >= seq - k: # 不超过10个的丢包或者10个的服务器包延迟 # 如果是前者,等服务器重传,如果是后者,等关键帧 # if True: roomGame = room_pb2.Room() roomGame.type = Types.GAMEDATA.value roomGame.seq = seq + 1 unackseq.append(seq + 1) seq += 1 roomGame.rotation = random.random() * math.pi * 2 roomGame.direction = int(random.random() * 4) # 假装自己是个位置计算公式 positoin[2] = (roomGame.rotation + positoin[2]) % (math.pi * 2) positoin[2] = positoin[2] * roomGame.direction data = roomGame.SerializeToString() client_socket.sendto(data, addr) print('send seq: ' + str(seq) + ' len ' + str(len(data)) + ' to ' + str(addr)) time.sleep(0.02) client_socket.close()
def conn(): BUFFER_SIZE = 1 server_host = '127.0.0.1' server_port = 4444 client_socket = socket.socket() client_socket.connect((server_host, server_port)) while True: print('please login(0) or regist(1):') flag = int(input()) # username = '******' # password = '******' username = input() password = input() if flag == 1: password_confirmed = input('Confirm your password: '******'m your father." # #client_socket.send(b"I'm your father.") # client_socket.send(data_to_send.encode('utf-8')) client_socket.close()
def connectionHandler(client_socket): while True: bytes_recv = client_socket.recv(BUFFER_SIZE) if len(bytes_recv) == 0: break room = room_pb2.Room() room.ParseFromString(bytes_recv) if room.id == TYPE_LOGIN: person = room.persons[0] username = person.name password = person.password print('user: '******' try to login!') rwl.readAcquire() if users.get(username): if users[username]['password'] == password: print('password correct') else: print('password incorrect') else: print('user not exists') rwl.readRelease() elif room.id == TYPE_REGIST: person = room.persons[0] username = person.name password = person.password rwl.readAcquire() if users.get(username): print('user exists') else: rwl.readRelease() rwl.writeAcquire() users[username] = {'username': username, 'password': password} rwl.writeRelease()
def handleData(data, addr): room = room_pb2.Room() room.ParseFromString(data) if room.type == Types.GAMEDATA.value: lastseq.value = max(lastseq.value, room.seq) if room.seq == needseq.value: print('send seq ' + str(lastseq.value) + ' ack') # render room = room_pb2.Room() room.type = Types.ACK.value # ack needseq.value += 1 # while True: # if needseq.value in recvseq: # recvseq.remove(needseq.value) # # render # # fix position # needseq.value += 1 # else: # break room.seq = needseq.value - 1 client_socket.sendto(room.SerializeToString(), addr) else: recvseq.append(room.seq) print('send seq ' + str(lastseq.value) + ' ack') room = room_pb2.Room() room.type = Types.ACK.value # ack room.seq = needseq.value - 1 client_socket.sendto(room.SerializeToString(), addr) elif room.type == Types.ACK.value: print('recv seq ' + str(room.seq) + ' ack') for seq in unackseq: if seq <= room.seq: unackseq.remove(seq) return None elif room.type == Types.PING.value: room = room_pb2.Room() room.type = Types.PING.value client_socket.sendto(room.SerializeToString(), addr) elif room.type == Types.KEYROOM.value: print(abs(room.rotation - positoin[2]) < 0.00001)
def handleData(data, addr, lastseq, needseq, unackseq, recvseq, client_socket): room = room_pb2.Room() room.ParseFromString(data) if room.type == Types.GAMEDATA.value: lastseq = max(lastseq, room.seq) if room.seq == needseq: print('send seq ' + str(lastseq) + ' ack') # render room = room_pb2.Room() room.type = Types.GAMEDATA.value # ack room.seq = needseq client_socket.sendto(room.SerializeToString(), addr) else: recvseq.append(room.seq) print('send seq ' + str(lastseq) + ' ack') room = room_pb2.Room() room.type = Types.ACK.value # ack client_socket.sendto(room.SerializeToString(), addr) elif room.type == Types.ACK.value: print('recv seq ' + str(room.seq) + ' ack') if room.seq in unackseq: unackseq.remove(room.seq) return None
def brocast(): seq = 1 k = 10 time.sleep(2) while True: if len(list(rooms[11]['person'])) > 0: room = room_pb2.Room() room.type = Types.GAMEDATA.value room.seq = seq if len(list(rooms[11]['person']['heim']['action'])) < seq + 1: continue p1 = room.persons.add() p2 = room.persons.add() unackseq.append(seq) seq += 1 data = room.SerializeToString() server_socket.sendto(data, rooms[11]['person']['heim']['addr']) print('send seq ' + str(room.seq) + ' len ' + str(len(data)))
def heartBeatProcess(recentaddrs, unackaddrs, alladdrs): while True: for ad in unackaddrs.keys(): print(str(ad) + ' not ack') unackaddrs[ad] -= 1 if unackaddrs[ad] <= 0: # remove conn if alladdrs.get(ad): alladdrs.pop(ad) if recentaddrs.get(ad): recentaddrs.pop(ad) unackaddrs.pop(ad) if len(alladdrs) > 0: for addr in alladdrs.keys(): if addr in recentaddrs: continue else: room = room_pb2.Room() room.type = Types.PING.value server_socket.sendto(room.SerializeToString(), addr) print('ping ' + str(addr)) if not unackaddrs.get(addr): unackaddrs[addr] = 3 time.sleep(3)
username = input('username: '******'password(less then 12): ') # flag = Types.LOGIN.value # username = '******' # password = '******' if flag == Types.REGIST.value: password_confirmed = input('Confirm your password: '******'password not the same, restart') continue elif len(password) > 12: print('password too long') else: break break room = room_pb2.Room() room.type = flag p1 = room.persons.add() p1.name = username p1.password = password data = room.SerializeToString() client_socket_tcp.send(data) # op = input('join room(0) or new room(1)') # if (op == '0'): # room = room_pb2.Room() # room.type = Types.GETROOM.value # data = room.SerializeToString() # client_socket_tcp.send(data) # elif (op == '1'): # room = room_pb2.Room() # room.type = Types.NEWROOM.value
def broadcast(rooms, unackseq, roomid, roomslock): # 传入roomid是要为每个room都启动一个线程,不然前面的room会被拖累? seq = 0 while True: roomslock.acquire() l = rooms[roomid]['person'] roomslock.release() if len(l) > 0: flag = True # for p in rooms[roomid]['person']: # if len(rooms[roomid]['person'][p]['action']) < seq+1: # flag = False if flag: roomslock.acquire() for p in rooms[roomid]['person']: roomres = room_pb2.Room() roomres.type = Types.GAMEDATA.value roomres.seq = seq + 1 seq += 1 p1 = roomres.persons.add() data = roomres.SerializeToString() addr = rooms[roomid]['person'][p]['addr'] if seq % 10 == 0: keyroom = room_pb2.Room() keyroom.type = Types.KEYROOM.value keyroom.rotation = rooms[roomid]['person'][p]['rotation'] server_socket.sendto(keyroom.SerializeToString(), addr) if seq == 1: r = room_pb2.Room() r.type = Types.LOADPACKGE.value p = r.persons.add() for i in range(1000): p.rotation.append(random.random()) p.direction.append(random.randint(0, 3)) p1 = r.persons.add() for i in range(1000): p1.rotation.append(random.random()) p1.direction.append(random.randint(0, 3)) d = r.SerializeToString() if len(d) > 1000: pass else: server_socket.sendto(d, addr) server_socket.sendto(data, addr) print('send seq ' + str(seq) + ' to ' + str(addr)) if unackseq.get(addr): seqs = unackseq[addr] seqs.append(seq) unackseq[addr] = seqs else: unackseq[addr] = [seq] print(unackseq[addr]) for s in unackseq[addr][:10]: # 限制发重前10个,不然发全部会网络拥塞,而且发全部也并没有什么作用 if seq - s > 10: roomres = room_pb2.Room() roomres.type = Types.GAMEDATA.value roomres.seq = s p1 = roomres.persons.add() data = roomres.SerializeToString() server_socket.sendto(data, addr) print('resend seq ' + str(s) + ' to ' + str(addr)) roomslock.release() time.sleep(0.02)
def handleData(data, addr, userMgr, rooms, server_socket, unackseq, personsroom, addrperson): room = room_pb2.Room() room.ParseFromString(data) resRoom = room_pb2.Room() if room.type == Types.LOGIN.value: person = room.persons[0] username = person.name password = person.password print('user: '******' try to login!') if not userMgr.checkUser({'name':username, 'password':password}): resRoom.type = Types.SUCC.value print('login succ') else: resRoom.type = Types.FAILED.value print('login failed') elif room.type == Types.REGIST.value: person = room.persons[0] username = person.name password = person.password if not userMgr.addUser({'name':username, 'password':password}): resRoom.type = Types.SUCC.value else: resRoom.type = Types.FAILED.value elif room.type == Types.JOINROOM.value: person = room.persons[0] if not rooms[room.id]['person'].get(person.name): rooms[room.id]['person'][person.name] = dict() rooms[room.id]['person'][person.name]['addr'] = addr rooms[room.id]['person'][person.name]['action'] = [(0.0, 0)] personsroom[person.name] = room.id addrperson[addr] = person.name print('room ' + str(room.id) + ' add person ' + person.name) elif room.type == Types.GAMEDATA.value: print('recv seq ' + str(room.seq) + ' len ' + str(len(data))) personname = addrperson[addr] roomid = personsroom[personname] if len(rooms[roomid]['person'][personname]['action']) == room.seq: rooms[roomid]['person'][personname]['action'].append((room.rotation, room.direction)) else: # rooms[roomid]['person'][personname]['action'][room.seq] = (room.rotation, room.direction) pass # print(rooms[room.id]['person'][person.name]['action']) roomres = room_pb2.Room() roomres.type = Types.ACK.value roomres.seq = room.seq server_socket.sendto(roomres.SerializeToString(), addr) print('send seq ' + str(room.seq) + ' ack to ' + str(addr) ) # to delete roomres = room_pb2.Room() roomres.type = Types.GAMEDATA.value roomres.seq = room.seq p1 = roomres.persons.add() data = roomres.SerializeToString() server_socket.sendto(data, addr) print('send seq ' + str(roomres.seq) + ' len ' + str(len(data))) elif room.type == Types.ACK.value: for s in unackseq: if s <= room.seq: unackseq.remove(s) print('recv seq ' + str(room.seq) + ' ack') return None return resRoom.SerializeToString()