如何在 `kill PID` 后将套接字服务器从 "busy" 状态中删除?

How to remove the socket server from "busy" state after `kill PID`?

我有一个简单的套接字服务器设置,可以将一些数字发送到 Intranet 中的客户端。在测试时,我从终端 (CTRL+C) 停止了 server.py 脚本,这后来在我尝试时导致 Safari 中的繁忙服务器错误到达同一页。

我看到了这个serverfault question但是问题是:

  1. 我找不到 /etc/init.d/networking restart 文件。我正在使用 Mac,这是用于 Linux。每次我测试我的服务器时,这也太过分了。至少每小时10次。

  2. 在代码中插入选项 SO_REUSEADDR 确实有所帮助 Address already in use 但我认为我的服务器已启动但处于繁忙状态。使用答案 here,我将 代码 编辑为:

host = <my machine address>  
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
port = 8080
s.bind((host, port))

我对我的服务器进行了哪些更改以消除 Safari 中的此错误?

Safari can’t open the page "my-ip" because the server unexpectedly dropped the connection. This sometimes occurs when the server is busy. Wait for a few minutes and then try again.

停止脚本后 lsof -i:8080 的输出为

python3.7 11881 <user>    3u  IPv4 <Device>   0t0  TCP <my machine address>?:http-alt (LISTEN)

我做了 kill 11881 然后重新 运行 代码,但在 Safari 中得到了相同的消息。

netstat -na | grep "8080" 的输出是

tcp4       0      0  <my machine address>.8080     *.*    LISTEN    

虽然脚本是 运行ning,但当我 KeyboardInterrupt 它时什么也没有。

Firefox 暂时显示页面然后显示错误页面

The connection was reset

Chrome 仅显示空白页。

更新: 它在 python 2.7 中有效,但在 3.5 中无效。代码的不同之处在于:

c.send('\n')

2.7 和

c.send(bytes('\n'.encode('utf-8')))

在 3.5 中

c

c, (client_host, client_port) = s.accept()

休息都一样。

我不小心注释掉了一行

c.recv(1000)

问题中提到了c

我在将它与同一文件的旧版本进行比较时发现了它。