Python 3.x 下面的Python套接字级编程代码在什么时候卡住了?
这是运行基本服务器的server.py文件:Python 3.x 下面的Python套接字级编程代码在什么时候卡住了?,python-3.x,sockets,Python 3.x,Sockets,这是运行基本服务器的server.py文件: import socket import sys sockett = socket.socket() sockett.bind(('127.0.0.1', 123)) sockett.listen(10) while True: print('1', end='') while True: print('2', end='') try: client, addr = socke
import socket
import sys
sockett = socket.socket()
sockett.bind(('127.0.0.1', 123))
sockett.listen(10)
while True:
print('1', end='')
while True:
print('2', end='')
try:
client, addr = sockett.accept()
print(client,addr)
break
except Exception as e:
print(e)
print(client.recv(400))
print(client.recv(1024))
print('3')
print('4')
这是我正在运行的client.py代码:
import socket
import sys
sockett = socket.socket()
sockett.connect(('127.0.0.1', 123))
sockett.send(b'0')
print("Hello")
我的疑问是,当我运行server.py(let S)文件,然后运行client.py(let C)文件时,S继续运行,但C停止运行,这应该是情况,但S被卡住的点是主要问题。它第一次打印3,然后不打印任何内容,不是4(因此不在循环中),也不是1(因此不仍然循环)。原因可能是什么?打印3后的代码在哪里?
这是我得到的输出:
12<socket......>(...)
b'0'
b''
3
_ (keeps on running indefinitely)
然后继续这样循环
while True:
print('1', end='')
while True:
print('2', end='')
try:
client, addr = sockett.accept()
print(client,addr)
break
except Exception as e:
print(e)
客户端连接后,此部分将成功(并且不会像您假设的那样遇到错误)
print(client.recv(400))
这将读取客户端发送的b'0'
print(client.recv(1024))
print('3')
这将等待更多数据。由于客户端关闭了连接,它将返回'
,即没有数据
然后它将转到循环的开头,并从那里进入内部循环,在那里它再次调用
accept
accept
将被阻止,直到获得新连接。由于不再运行客户端,accept
将永远阻塞。服务器实际上正在循环,但运行此脚本时看不到1或2的原因是因为没有刷新输出:
import socket
import sys
sockett = socket.socket()
sockett.bind(('127.0.0.1', 123))
sockett.listen(10)
while True:
print('1', end='')
while True:
print('2', end='', flush=True)
try:
client, addr = sockett.accept()
print(client,addr)
break
except Exception as e:
print(e)
print(client.recv(400))
print(client.recv(1024))
print('3')
print('4')
您会注意到,使用flush=True
,在print('2',end='',flush=True)
中,您会看到12
在客户端连接之前出现,在客户端断开连接之后再次出现
12(…)
b'0'
b“
3.
12_(继续无限期运行)
有了这个,您可以看到它再次在
客户端等待,addr=sockett.accept()
谢谢您的回答。我完全理解,但flush到底做什么?为什么我们使用它和不使用它有区别?刷新输出意味着什么?@TanishJain会解释很多。真正简短的版本是,当有大量输出发生时,它有助于提高程序速度。谢谢你的帮助,我现在完全理解了。请注意,很抱歉,您的答复不完整。请把问题再读一遍。你写的答案是我期望发生的事情,但它并不是这样发生的。“鲁齐姆已经给出了正确的答案。”TanishJain:你可能认为它是不完整的,因为它没有解决你没有看到一些输出的答案。它解释了您的程序似乎被卡住的原因和位置(挂起接受)-这正是您在问题标题中所问的。
import socket
import sys
sockett = socket.socket()
sockett.bind(('127.0.0.1', 123))
sockett.listen(10)
while True:
print('1', end='')
while True:
print('2', end='', flush=True)
try:
client, addr = sockett.accept()
print(client,addr)
break
except Exception as e:
print(e)
print(client.recv(400))
print(client.recv(1024))
print('3')
print('4')
12<socket...> (...)
b'0'
b''
3
12_ (keeps on running indefinitely)