所以我的问题是,如果有PING,并且在一分钟的间隔内没有ping,我如何让我的漫游器监听,它会做出反应,好像连接已丢失。人们将如何去做呢?
编辑:
这是用于注册连接辐射的工作代码(尽管在重新连接时遇到麻烦):
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import socket import string import os import platform import time # Variables HOST = "irc.channel.net" PORT = 6667 NICK = "Botname" IDENT = "Botname" REALNAME = os.getenv('USER') CHAN = "##ChannelName" readbuffer = "" # Our IRC connection irc = socket.socket() irc.settimeout(300) connected = False def connection(host, port, nick, ident, realname, chan): while connected is False: try: irc.connect((host, port)) irc.send("NICK %s\r\n" % nick) irc.send("USER %s %s bla :%s\r\n" % (ident, host, realname)) irc.send("JOIN :%s\r\n" % chan) # Initial msg to send when bot connects irc.send("PRIVMSG %s :%s\r\n" % (chan, "TehBot: "+ nick + " Realname: " + realname + " .")) global connected connected = True except socket.error: print "Attempting to connect..." time.sleep(5) continue connection(HOST, PORT, NICK, IDENT, REALNAME, CHAN) while connected: try: data = irc.recv ( 4096 ) # If connection is lost if len(data) == 0: break print data # If Nick is in use if data.find ( "Nickname is already in use" ) != -1: NICK = NICK + str(time.time()) connection(HOST, PORT, NICK, IDENT, REALNAME, CHAN) # Ping Pong so we don't get disconnected if data[0:4] == "PING": irc.send ( "PONG " + data.split() [ 1 ] + "\r\n" ) except socket.timeout: global connected connected = False print connected break print "Out of loop" connection(HOST, PORT, NICK, IDENT, REALNAME, CHAN)
last_ping = time.time() threshold = 5 * 60 # five minutes, make this whatever you want while connected: data = irc.recv ( 4096 ) # If Nick is in use if data.find ( 'Nickname is already in use' ) != -1: NICK = NICK + str(time.time()) Connection() # Ping Pong so we don't get disconnected if data.find ( 'PING' ) != -1: irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' ) last_ping = time.time() if (time.time() - last_ping) > threshold: break
这将记录每次ping的时间,如果持续时间太长而没有一次ping,请跳出connected循环。您不需要while connected == True:,只需while connected:执行相同的操作即可。
connected
while connected == True:
while connected:
另外,考虑使用connection代替Connection,这是Python约定,仅对类使用大写名称。
connection
Connection