【问题标题】:How can python socket client receive without being blockedpython socket客户端如何接收而不被阻塞
【发布时间】:2016-04-18 03:19:28
【问题描述】:

一个简单的python socket编程演示:

server.py

import socket

host = '127.0.0.1'
port = 8000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, port))
s.listen(1)

conn, addr = s.accept()

while True:
    data = conn.recv(1024)
    print 'Received:', data
    if not data:
        break
    conn.sendall(data)
    print 'Sent:', data

conn.close()

client.py

import socket

host = '127.0.0.1'
port = 8000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host, port))
s.sendall('Hel')
s.sendall('lo world!')
print 'Received:', s.recv(1024)

s.close()

现在代码运行良好。但是,客户端可能不知道服务器是否总是每次都发回。我在 server.py 中尝试了 while-loop 的对称代码

client_2.py

import socket

host = '127.0.0.1'
port = 8000

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host, port))
s.sendall('Hel')
s.sendall('lo world!')
while True:
    data = s.recv(1024)
    if not data:
        break
print 'Received:', data

s.close()

此代码将在

处阻塞
data = s.recv(1024)

但是在server.py中,如果没有接收到数据,它将是空白字符串,并从while循环中中断

为什么它对客户不起作用?如何在不使用超时的情况下实现相同的功能?

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    您可以通过socket.setblocking(false) 将套接字设置为非阻塞操作,相当于socket.settimeout(0)。解决这个“不使用超时”是不可能的。

    【讨论】:

      猜你喜欢
      • 2017-04-18
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 2017-01-29
      • 2010-10-25
      相关资源
      最近更新 更多