Python 3.4 套接字未收到完整消息

Posted

技术标签:

【中文标题】Python 3.4 套接字未收到完整消息【英文标题】:Python 3.4 socket does not receive full message 【发布时间】:2014-05-27 14:21:01 【问题描述】:

我正在编写一个机器人来通过 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 连接 here 的帮助文档。

【问题讨论】:

【参考方案1】:

我认为你应该做的是这样的:

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()))

来自这个问题的代码: IRC bot in python won't send messages

【讨论】:

我想我可能应该在 OP 中澄清一下,但我不太担心得到一个有效的脚本(我找到了解决方法),而不是弄清楚为什么这是一个问题。 Twitch IRC 帮助文档指出,无论 IRC 标准如何,发送 PASS 和 NICK 都是正确的连接过程。我只是对为什么服务器不以相同的方式响应看似相同的查询感到困惑。 @Ceann 我没有 twitch 的证书,无法测试 telnet 和 python ;) 明白了。不过感谢您的帮助!

以上是关于Python 3.4 套接字未收到完整消息的主要内容,如果未能解决你的问题,请参考以下文章

同时发送/接收消息套接字python

Python网络编程—(TCPUDP区别)

Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

在 Windows 10 上本地运行 Python 2.7 Web 服务时禁止访问套接字消息

如何确保消息使用 WebSockets 到达目的地?

自服务以来,我使用一个套接字时收到多个消息