コード例 #1
0
def startserver(msglist, servers, clients_to):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    for i in range(55568, 55578):
        try:
            sock.bind(('localhost', i))
            print('端口%d可用,绑定成功!' % i)
            servers.put(sock)
            break
        except Exception as e:
            print('Fail to bind.', e)
            pass
    sock.listen(2)
    #print('start on ',i)
    while True:
        netsock, address = sock.accept()
        print('connected from:{}'.format(str(address)))
        peers_to = [
            key[0] + ':' + str(key[1]) for key, value in clients_to.items()
        ]
        msg = msgcreater.createmsg('network', 'serverlist_peer', '',
                                   json.dumps(peers_to), True)
        netsock.send(msg)
        msg = msgcreater.createmsg('network', 'new_peer', 'from', netsock)
        msglist.put(msg)
        t = threading.Thread(target=recv_timeout,
                             args=(netsock, address, msglist))
        t.start()
コード例 #2
0
def recv_timeout(sock, addr, msglist, timeout=5):
    sock.setblocking(0)
    total_data = []
    data = ''
    begin = time.time()
    while 1:
        if total_data and time.time() - begin > timeout:
            break
        elif time.time() - begin > timeout * 2:
            break
        try:
            data = sock.recv(8192)
            if data:
                data = data.decode('utf8')
                data = json.loads(data)
                if data['type'] == 'heartbeat':
                    msg = msgcreater.createmsg('network', 'heartbeat_reply',
                                               '', '', True)
                    try:
                        sock.send(msg)
                    except:
                        pass
                elif data['type'] != 'heartbeat':
                    msglist.put(data)
                total_data.append(data)
                begin = time.time()
                #print('---------------------\nreceive from--->',addr,'\ncontent is  --->',data,'\n---------------------')
            else:
                time.sleep(0.1)
        except:
            pass
    msg = msgcreater.createmsg('network', 'lost_peer', 'from', addr)
    msglist.put(msg)
    sock.close()
    print('connection lost----->', addr)
コード例 #3
0
 def send_heartbeat(self):
     import time
     while self.flag:
         time.sleep(2)
         data = msgcreater.createmsg('network', 'heartbeat', '', '', True)
         try:
             self.sock.send(data)
         except Exception as e:
             self.update()
             self.msgqueue.put(
                 msgcreater.createmsg('network', 'lost_peer', 'to',
                                      self.addr))
コード例 #4
0
 def on_receive(self):
     total_data = []
     timeout = 5
     begin = time.time()
     while 1:
         if total_data and time.time() - begin > timeout:
             break
         elif time.time() - begin > timeout * 2:
             break
         try:
             data = self.sock.recv(8192)
             if data:
                 data = data.decode('utf8')
                 data = json.loads(data)
                 if data['type'] == 'heartbeat_reply':
                     self.msgqueue.put(data)
                     # print('heart_reply')
                     pass
                 elif data['type'] != 'heartbeat_reply':
                     #print('receive data from server:')
                     self.msgqueue.put(data)
                 total_data.append(data)
                 begin = time.time()
                 # print('---------------------\nreceive from--->',addr,'\ncontent is  --->',data,'\n---------------------')
             else:
                 time.sleep(0.1)
         except Exception as e:
             pass
     self.update()
     self.msgqueue.put(
         msgcreater.createmsg('network', 'lost_peer', 'to', self.addr))
     print('connection lost----->', self.addr)
     self.sock.close()
コード例 #5
0
 def connect_to_server(self, clients_to):
     try:
         if (self.addr not in list(
                 clients_to.keys())) and len(clients_to) <= 10:
             self.sock.connect(self.addr)
             print('connected to:{}'.format(str(self.sock.getpeername())))
             msg = msgcreater.createmsg('network', 'new_peer', 'to',
                                        self.sock)
             self.msgqueue.put(msg)
             return True
         else:
             return False
     except:
         return False
コード例 #6
0
 def __init__(self,
              addr,
              msgqueue,
              localserverip,
              localserverport,
              clients_to,
              timeout=5):
     self.addr = addr
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     self.msgqueue = msgqueue
     self.flag = self.connect_to_server(clients_to)
     if self.flag:
         content = localserverip + ":" + str(localserverport)
         handshake = msgcreater.createmsg('network', 'handshake_peer',
                                          'from', content, True)
         self.sock.send(handshake)
         self.sock.setblocking(0)
         threading.Thread(target=self.send_heartbeat).start()
         threading.Thread(target=self.on_receive).start()