コード例 #1
0
ファイル: server.py プロジェクト: Heimzeng/show-me-the-code
 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()
コード例 #2
0
ファイル: client.py プロジェクト: Heimzeng/show-me-the-code
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()
コード例 #3
0
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()
コード例 #4
0
ファイル: server.py プロジェクト: Heimzeng/show-me-the-code
 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()
コード例 #5
0
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()
コード例 #6
0
ファイル: client.py プロジェクト: Heimzeng/show-me-the-code
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()
コード例 #7
0
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()
コード例 #8
0
 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)
コード例 #9
0
ファイル: client.py プロジェクト: Heimzeng/show-me-the-code
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
コード例 #10
0
 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)))
コード例 #11
0
ファイル: server.py プロジェクト: Heimzeng/show-me-the-code
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)
コード例 #12
0
     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
コード例 #13
0
ファイル: server.py プロジェクト: Heimzeng/show-me-the-code
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)                    
コード例 #14
0
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()