阻塞的recv()返回空行而非数据

1 投票
1 回答
1722 浏览
提问于 2025-04-18 08:57

我正在做一个Python客户端,它需要和一个用C语言写的服务器进行对话。目前,服务器能识别一些命令并回复“ok”(我用netcat测试服务器时,它工作正常)。但是我的Python客户端只有四分之一的时间能收到“ok”,其余时间收到的都是空行。我不明白为什么,因为我把socket设置成了阻塞模式,所以我觉得它应该能收到一些东西,但我不知道是什么。

这是我现在的代码。“info”只是一个存储了一些字符串的对象,循环之前的部分都能正常工作,并且为了让人更容易理解,我简化了一下:我应该先收到一条欢迎消息,然后发送连接玩家的队名,接着再接收一个位置。

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, msg:
    print 'Failed to create socket. Error code: ' + str(msg[0]) + ' , Error message : ' + msg[1]
    sys.exit();

try:
    remote_ip = socket.gethostbyname(info.host)
except socket.gaierror:
    print "Hostname could not be resolved. Exiting"
    sys.exit()

s.setblocking(1)
s.settimeout(60)
s.connect((remote_ip, info.port))

data = s.recv(1024)
print data
team = info.team + "\n"
s.sendall(team)
data = s.recv(1024)
print data

while 42:
    msg = raw_input('>> ')
    s.sendall(msg + "\n")
    data = s.recv(1024)
    if data == "":
        break
    else:
        print data

s.shutdown(socket.SHUT_WR)
s.close()

1 个回答

0

我觉得你确实得到了什么:可以用ord()函数把数据转换成ascii码来查看。我的猜测是,在服务器发送给你的响应中,“ok”之前有三行不可打印的内容。你只需要找出来,然后在一个新的循环中处理它们。

撰写回答