我正在修改golang,我的第一个代码是一个简单的IRC机器人,代码如下:
package main
import ("net"
"log"
"bufio"
"fmt"
"net/textproto"
)
type Bot struct{
server string
port string
nick string
user string
channel string
pass string
pread, pwrite chan string
conn net.Conn
}
func NewBot() *Bot {
return &Bot{server: "irc.freenode.net",
port: "6667",
nick: "subsaharan",
channel: "#rapidsms",
pass: "",
conn: nil,
user: "blaze"}
}
func (bot *Bot) Connect() (conn net.Conn, err error){
conn, err = net.Dial("tcp",bot.server + ":" + bot.port)
if err != nil{
log.Fatal("unable to connect to IRC server ", err)
}
bot.conn = conn
log.Printf("Connected to IRC server %s (%s)\n", bot.server, bot.conn.RemoteAddr())
return bot.conn, nil
}
func main(){
ircbot := NewBot()
conn, _ := ircbot.Connect()
conn.Write([]byte("NICK " + ircbot.nick))
conn.Write([]byte("JOIN " + ircbot.channel))
defer conn.Close()
reader := bufio.NewReader(conn)
tp := textproto.NewReader( reader )
for {
line, err := tp.ReadLine()
if err != nil {
break // break loop on errors
}
fmt.Printf("%s\n", line)
}
}
当我运行此代码时,我在终端上获得以下输出:
2012/11/12 13:31:20 Connected to IRC server irc.freenode.net (193.219.128.49:6667)
:sendak.freenode.net NOTICE * :*** Looking up your hostname...
:sendak.freenode.net NOTICE * :*** Checking Ident
:sendak.freenode.net NOTICE * :*** Couldn't look up your hostname
:sendak.freenode.net NOTICE * :*** No Ident response
ERROR :Closing Link: 127.0.0.1 (Connection timed out)
连接保持超时的原因是什么?
答案 0 :(得分:20)
发送到IRC服务器的所有命令最多都有 255 512字节,并且必须以回车符和换行符\r\n
终止。
conn.Write([]byte("NICK " + ircbot.nick + "\r\n"))
conn.Write([]byte("JOIN " + ircbot.channel + "\r\n"))
此外,freenode希望USER
命令是它看到的第一件事。
conn.Write([]byte("USER "+ircbot.nick+" 8 * :" + ircbot.nick + "\r\n"))
conn.Write([]byte("NICK " + ircbot.nick + "\r\n"))
conn.Write([]byte("JOIN " + ircbot.channel + "\r\n"))
作为旁注,您可以使用fmt.Fprintf
格式化并发送数据,让您的生活更轻松:
fmt.Fprintf(conn, "USER %s 8 * :%s\r\n", ircbot.nick, ircbot.nick)
fmt.Fprintf(conn, "NICK %s\r\n", ircbot.nick)
fmt.Fprintf(conn, "JOIN %s\r\n", ircbot.channel)
fmt.Fprintf
的第一个参数必须是满足io.Writer
接口的任何类型。 net.Conn
实现都是这样做的。因此,您可以将它们传递给任何期望io.Writer
(或io.Reader
实现)的函数。
答案 1 :(得分:3)
此外,有时IRC服务器将发送“PING:cookie”消息(例如,如果您的连接空闲时间过长)。您应该回复“PONG:cookie”。