javascript - XMLHttpRequest 创建了几个传出端口——为什么?

标签 javascript python ajax post xmlhttprequest

我是 JavaScript 和 AJAX 的新手。一般而言,这也是网络通信的新手。

我正在尝试创建一个与 Python 服务器通信的动态更新网页。我一直在本地测试所有内容,到目前为止一切正常。我认为。

Python 服务器在本地主机端口 8000 上提供“page.html”。HTML 页面使用 AJAX 和 XMLHttpRequest 将数据 POST 到服务器。我可以很好地向服务器发送数据。

这就是问题所在:我的服务器指示为每个帖子打开一个新的客户端端口。这让我感到害怕,因为我已经习惯了在单个端口上进行通信的 TCP 套接字。

这是服务器代码(server.py):

import cgi
import http.server
import urllib
import socketserver

class ServerHandler(http.server.SimpleHTTPRequestHandler):
    def do_POST(self):
        ctype, pdict = cgi.parse_header(self.headers['content-type'])
        length = int(self.headers['content-length'])
        postvars = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8'))
        ip, port = self.client_address
        print(ip, "@", port, "-->", postvars)

def start_server():
    httpServer = socketserver.TCPServer(("", 8000), ServerHandler)
    httpServer.serve_forever()

if __name__ == "__main__":
    start_server()

这是 HTML 代码 (page.html):

<html>
    <head></head>
    <body>
        <script type="text/javascript">
            function send_receive() {
                var http = new XMLHttpRequest();
                var data = document.test_form.data.value;
                var params = "data=" + data.toString();

                http.open("POST", "page.html", true);
                http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
                http.setRequestHeader("Content-length", params.length);
                http.setRequestHeader("Connection", "close");
                http.send(params);
            }
        </script>

        <form name=test_form>
            Data: <input type="text" name="data" value="1">
            <input type=button onClick="send_receive();" value="Send"><br /><br />
        </form>
    </body>
</html>

这是在页面上发送 1 到 6 后的服务器输出。

127.0.0.1 @ 52884 --> {'data': ['1']}
127.0.0.1 @ 52885 --> {'data': ['2']}
127.0.0.1 @ 52886 --> {'data': ['3']}
127.0.0.1 @ 52887 --> {'data': ['4']}
127.0.0.1 @ 52888 --> {'data': ['5']}
127.0.0.1 @ 52889 --> {'data': ['6']}

要测试启动 server.py,然后转到浏览器并输入

http://localhost:8000/page.html OR http://127.0.0.1:8000/page.html

如您所见,每个 POST 的端口都会增加。我做错了什么吗?我觉得 XHR 挥之不去,需要关闭,但从我在网上阅读的内容来看,显然每个 POST 都需要创建一个新的 XHR。谢谢!

最佳答案

没关系。 服务器从其可用端口池中选择一个新的源端口 - 这确保了唯一 TCP connection tuple对于 HTTP 每个请求及其建立的相应 TCP 连接。 (服务器选择用于传入连接的源端口。)

不能保证将使用相同的客户端端口 - 实际上相同的源端口不能用于相同的源 IP,除非 TCP 连接已被完全关闭;这包括 TIME_WAIT 中的那些1。当 TCP 连接完全关闭时,源端口将被释放回可用池。

不同的源端口表示有问题;增加的值(value)仅仅是一个实现(和可用池)的细节。另一方面,永不关闭的连接可能是个问题。使用 netstat命令查看 TCP 连接及其状态。


1 在具有过多从同一远程 IP 快速创建连接的系统上,可能需要启用 'port reuse' .

"Coping with the TCP TIME-WAIT state on busy Linux servers"这篇文章很好读;它包括漂亮的图表、很好的解释以及对实际限制的讨论。

关于javascript - XMLHttpRequest 创建了几个传出端口——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32555564/

相关文章:

python - PyCharm 中类 'objects' 的未解析属性引用 'Foo'

javascript - $.ajax => 触发失败而不是完成

java - Tapestry 使用 AJAX 从可编辑网格更新 DAO

javascript - html5 中的 2D 侧滚动相机 View

javascript - 为什么我们需要在 switch 语句中分支时对位字段执行按位与

javascript - 制作CSS自动 slider

python - 使用 Python 和 Flask 制作应用程序时出现 `json.decoder.JSONDecodeError`

javascript - 更改图像 src 而不从 mysql 数据库刷新

python - Visual Studio Code - Python 调试 - 执行时步入外部函数的代码

php - 在模态中显示查询中的数据