【问题标题】:Socket stuck in loop套接字卡在循环中
【发布时间】:2019-08-14 09:38:17
【问题描述】:

我正在尝试制作服务器和客户端(我仍在学习),但即使在他收到客户端的“退出”之后,服务器仍卡在 while 循环中。 我究竟做错了什么? 谢谢你

服务器

import socket
s = socket.socket()
s.bind(("0.0.0.0",5511))
s.listen(1)

c, addr = s.accept()
msg = c.recv(2048).decode()
while msg != "exit":
    print(msg)
    print("still connected")
    msg = c.recv(2048).decode()
    c.settimeout(5)
c.close()
s.close()

客户

import socket
s = socket.socket()
s.connect(("127.0.0.1",5511))

msg = input("What send to the server: ")
while msg != "exit":
    s.send(msg.encode())
    msg = input("What send to the server: ")
s.close()

【问题讨论】:

  • 发送除“exit”以外的任何内容时它是否正常工作?
  • 是的,效果很好。就在我发送“退出”时,它转为循环
  • 你试过stackoverflow.com/questions/44662178/…的解决方案吗
  • 我不认为客户端可以发送“exit”,因为客户端一旦获得“exit”就会关闭。
  • 请注意,sock.recv 在另一端关闭套接字时返回一个Falsey/empty 字符串(就像客户端在调用close 时所做的那样)。这通常是客户退出的更好信号

标签: python python-3.x sockets


【解决方案1】:

我最初将其发布为对 rmh 答案的编辑,但编辑直到现在还没有通过,所以我发布了我自己的答案

server.py

import socket
s = socket.socket()
s.connect(("127.0.0.1",5511))

msg = ""
while msg != "exit":
  msg = input("What send to the server: ")
  s.send(msg.encode())
s.close()

client.py

import socket
s = socket.socket()
s.bind(("0.0.0.0",5511))
s.listen(1)

c, addr = s.accept()
msg = c.recv(2048).decode()
while msg != "exit":
  print(msg)
  print("still connected")
  msg = c.recv(2048).decode()
  c.settimeout(5)
c.close()
s.close()

【讨论】:

  • 感谢您的帮助
【解决方案2】:

感谢您的所有帮助, 我在“while”之后添加了新的“s.send(msg.encode())”行,它现在可以工作了。

非常感谢!

【讨论】:

    【解决方案3】:

    查看 客户端 中的 while 循环。如果msg == "exit",它不会执行主体。因此,如果msg"exit",则客户端不会向服务器发送任何内容。结果,服务器没有收到消息并阻塞在“服务器”代码中的msg = c.recv(2048).decode() 行。

    server.py

    import socket
    s = socket.socket()
    s.connect(("127.0.0.1",5511))
    
    msg = ""
    while msg != "exit":
      msg = input("What send to the server: ")
      s.send(msg.encode())
    s.close()
    

    client.py

    import socket
    s = socket.socket()
    s.bind(("0.0.0.0",5511))
    s.listen(1)
    
    c, addr = s.accept()
    msg = c.recv(2048).decode()
    while msg != "exit":
      print(msg)
      print("still connected")
      msg = c.recv(2048).decode()
      c.settimeout(5)
    c.close()
    s.close()
    

    【讨论】:

    • 我也找到了解决方案,但我的问题是为什么客户端的设计方式使其免于将“退出”作为消息发送到服务器。如果有人有文档,我建议添加到上面的答案中。
    • 感谢您的帮助,正确的做法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多