V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sbldehanhan
V2EX  ›  Python

msg = input("回复:")这句为啥在 Linux 上不阻塞?

  •  
  •   sbldehanhan · 260 天前 · 1322 次点击
    这是一个创建于 260 天前的主题,其中的信息可能已经有所发展或是发生改变。
    import socket
    #创建服务端的 socket 对象 socketserver
    socketserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = '192.168.0.103'
    port = 4567
    #绑定地址(包括 ip 地址会端口号)
    socketserver.bind((host, port))
    #设置监听
    socketserver.listen(5)
    #等待客户端的连接
    #注意:accept()函数会返回一个元组
    #元素 1 为客户端的 socket 对象,元素 2 为客户端的地址(ip 地址,端口号)
    clientsocket,addr = socketserver.accept()
    
    #while 循环是为了能让对话一直进行,直到客户端输入 q
    while True:
    
        #接收客户端的请求
        recvmsg = clientsocket.recv(1024)
        #把接收到的数据进行解码
        strData = recvmsg.decode("utf-8")
        #判断客户端是否发送 q ,是就退出此次对话
        if strData=='q':
            break
        print("收到:"+strData)
        msg = input("回复:")
        #对要发送的数据进行编码
        clientsocket.send(msg.encode("utf-8"))
    
    第 1 条附言  ·  259 天前
    同一个版本也有问题,是代码有问题吗?客户端代码如下:
    ```
    #while 循环是为了保证能持续进行对话
    while True:
    #输入发送的消息
    sendmsg = input("请输入:")
    #如果客户端输入的是 q ,则停止对话并且退出程序
    if sendmsg=='q':
    break

    sendmsg = sendmsg
    #发送数据,以二进制的形式发送数据,所以需要进行编码
    client.send(sendmsg.encode("utf-8"))
    msg = client.recv(1024)
    #接收服务端返回的数据,需要解码
    print(msg.decode("utf-8"))
    #关闭客户端
    client.close()
    ```
    6 条回复    2023-08-17 13:30:04 +08:00
    Nooooobycat
        1
    Nooooobycat  
       260 天前
    python 3.8.10 无法复现你的问题
    ![]( https://s3.bmp.ovh/imgs/2023/08/15/ecad767cf85f3f6e.png)
    zictos
        2
    zictos  
       260 天前
    肯定会阻塞的,除非程序已经 break 退出了。
    你看到执行 print("收到:"+strData)这行后,之后就会显示“回复:”让你输入的,这个时候就阻塞了
    sbldehanhan
        3
    sbldehanhan  
    OP
       259 天前
    @Nooooobycat #1 验证了一下,不是操作系统的问题。应该是 Python 版本不一致导致的,我客户端用的是 3.11 ,服务端用的是 3.10 。如果代码用的是同一个版本,可以正常工作。
    sbldehanhan
        4
    sbldehanhan  
    OP
       259 天前
    @zictos #2 应该是 Python 版本不一致导致的。
    julyclyde
        5
    julyclyde  
       258 天前
    @sbldehanhan 不可能
    julyclyde
        6
    julyclyde  
       258 天前
    你是放后台运行了吧? stdin 为 null
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   812 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 22:22 · PVG 06:22 · LAX 15:22 · JFK 18:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.