【问题标题】:python: loop with socket.recv()python:使用 socket.recv() 循环
【发布时间】:2013-01-29 00:51:40
【问题描述】:

你知道为什么这个循环没有中断吗?

#!/usr/bin/env python

from socket import *
import os
import sys

if __name__ == '__main__':
 HOST = '127.0.0.1'
 PORT = 55554

 print 'Creating socket'
 socketProxy = socket(AF_INET, SOCK_STREAM)

 print 'bind()'
 socketProxy.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
 socketProxy.bind((HOST, PORT))

 print 'Waiting for connection request'
 socketProxy.listen(1)
 conn, addr = socketProxy.accept()

 print 'Connected to ', addr

 request = ''

 while True:
    data = conn.recv(16);
    if not data: break
    request = request+data


print request
sys.stdout.flush()

我正在编写一个小的服务器代理来获取可以任意长的请求,所以我必须等到我收到所有请求。无论如何,这个循环(当 len(data) == 0 时)不会停止,它会一直等待。我怎样才能阻止它? 谢谢

【问题讨论】:

  • 客户端没有关闭/关闭套接字,也许?
  • 你确定它不会因为套接字没有收到任何数据而简单地挂在conn.recv(16)吗?
  • 是的,客户端不会关闭套接字,因为它会等待答案...
  • 记住套接字默认是阻塞的,所以如果没有什么可以接收,那么recv会阻塞等待。
  • 我知道...问题是客户端和服务器都是我们老师给的,那我们就必须写一个代理。当客户端发送请求(类似 http 的请求)时,它不会关闭套接字......并等待答案。代理必须从服务器获取 html 页面并将其发送给客户端。那么,为了不阻塞地从客户端获取请求,我应该执行一个 recv(n) 并决定一个相当大的 n 吗?

标签: python python-sockets


【解决方案1】:

一种解决方案是使套接字成为非阻塞的。然后你在一个循环中接收,直到不再接收到数据。如果没有收到数据(即request 为空),则连接已关闭,否则您有您的请求。

当您收到请求后,将其发送到实际服务器,并在等待回复时执行与上述相同的操作。将回复发送给客户端。

【讨论】:

  • 我应该使用 MSG_DONTWAIT 使套接字不阻塞吗?
  • @user1576208 或者使用socket.setblocking方法。
  • 客户端可能需要一些时间才能将任何数据发送到套接字,这意味着连接没有关闭,但在调用 recv() 时没有接收到数据。每当客户端终止连接时,您应该确保协议有某种方式通过消息进行检测。
【解决方案2】:

你可以尝试设置一个超时时间,见Python socket recv data in while loop not stopping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    相关资源
    最近更新 更多