Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 下面的Python套接字级编程代码在什么时候卡住了?_Python 3.x_Sockets - Fatal编程技术网

Python 3.x 下面的Python套接字级编程代码在什么时候卡住了?

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

这是运行基本服务器的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 = 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)