Python 3.4 socket未接收到完整消息
我正在编写一个机器人,用来通过IRC监控twitch.tv上的聊天。下面是用Telnet成功连接和登录的样子:
Microsoft Telnet> o irc.twitch.tv 6667
PASS <password>
NICK <username>
:tmi.twitch.tv 001 <user> :Welcome, GLHF!
:tmi.twitch.tv 002 <user> :Your host is tmi.twitch.tv
:tmi.twitch.tv 003 <user> :This server is rather new
:tmi.twitch.tv 004 <user> :-
:tmi.twitch.tv 375 <user> :-
:tmi.twitch.tv 372 <user> :You are in a maze of twisty passages, all alike.
:tmi.twitch.tv 376 <user> :>
我写了一个简单的测试脚本,它能成功连接到服务器,但只接收到部分消息。
# irctest.py
import socket
HOST='irc.twitch.tv'
PORT=6667
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b"PASS oauth:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n")
s.sendall(b"NICK user\r\n")
data = s.recv(2048)
s.close()
print(repr(data.decode()))
用data.decode()
打印出来的字符串只是成功连接响应的第一行:
':tmi.twitch.tv 001 <user> :Welcome, GLHF!\r\n'
这说明连接是正常的。我尝试过第二次使用s.recv(2048)
,但这一直卡在那里,使用s.settimeout(None)
后更是如此。我也尝试过增加缓冲区的大小,但似乎没有什么效果。有没有人知道这是怎么回事?
Twitch有一份关于IRC连接的帮助文档,可以在这里查看。
1 个回答
0
我觉得你可以这样做:
import socket
HOST='irc.twitch.tv'
PORT=6667
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(None)
s.connect((HOST, PORT))
s.sendall(b"PASS oauth:...")
s.sendall(b"USER ...")
s.sendall(b"NICK ...")
s.sendall(b"JOIN ...")
while True:
data = irc.recv(1204)
if data.find('PING') != -1:
irc.send(data.replace('PING', 'PONG'))
print(repr(data.decode()))
这个问题的代码来自于这里: Python中的IRC机器人无法发送消息