知道了原理以后,就可以着手来写了。
服务器暂时用现有的程序,只需要自己写客户端即可。打算用python来写。
需要涉及的技术:
(1)python的socket模块
(2)IRC命令(用send发送)
刚开始就遇到了问题:可以连接到服务器上,但是无法加入频道中。不就应该是send('join #ircchannel \r\n')吗?
后来发现,这句以后服务器会发来ping命令,你必须回答一个pong,才可以连接到频道中。(后来的后来才发现,只是USER被服务器接收的太慢了,只用sleep一下,再JOIN,就可以加入频道了)
import socketimport timenetwork = 'irc.insert.a.network.here' port = 6667 irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) irc.connect ( ( network, port ) ) irc.send ( 'NICK PyIRC\r\n' ) irc.send ( 'USER PyIRC PyIRCPyIRC :Python IRC\r\n' ) time.sleep(1) irc.send ( 'JOIN #pyirc\r\n' ) time.sleep(1) irc.send ( 'PRIVMSG #pyirc:Can you hear me?\r\n' ) time.sleep(1) irc.send ( 'PART #pyirc\r\n' ) irc.send ( 'QUIT\r\n' ) irc.close()
只不过ping的有点慢,但还是可以通信的。
不过,这个代码也太丑了,简单粗暴,就不能美化一下吗?做了一点改变,总比原来的好,最讨厌给类和函数起名字了……
这个程序增加了一个功能,接收其他用户发来的消息。
import socketclass IRCControl(object): def __init__(self,nickname,network,port,channel): self.nickname=nickname self.network=network self.port=port self.channel=channel def interact(self): irc = socket.socket( socket.AF_INET, socket.SOCK_STREAM ) irc.connect((self.network,self.port)) irc.send('nick %s\r\n '%self.nickname) irc.send ( 'USER %s %s %s : %s \r\n'% (self.nickname,self.network,self.network,self.nickname)) while True: data = irc.recv ( 4096 ) print data if data.find ( 'PING' ) != -1: irc.send ( 'PONG ' + data.split() [ 1 ] + '\r\n' ) irc.send ( 'JOIN %s\r\n'%self.channel) irc.send('privmsg %s : canyouhearme\r\n'%self.channel) elif data.find ( 'PRIVMSG' ) != -1: nick = data.split ( '!' ) [ 0 ].replace ( ':', '' ) message = ':'.join ( data.split ( ':' ) [ 2: ] ) print nick + ':', messagedef main(): nickname='lily' network = '172.30.41.104' port = 6667 channel='#abs' control=IRCControl(nickname,network,port,channel) control.interact() if __name__=='__main__': main()