XMLHttpRequest创建了几个出站端口——为什么?
XMLHttpRequest creates several outgoing ports - why?
我是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。谢谢!
很好。服务器从这些端口的可用池中选择一个新的源端口——这确保了HTTP的每个请求和它建立的相应TCP连接都有一个唯一的 TCP连接元组。(服务器选择它用于传入连接的源端口。)
不能保证相同的客户端端口将被使用 -事实上,相同的源端口不能用于相同的源IP,除非TCP连接已完全关闭;这包括TIME_WAIT1中的那些。当TCP连接完全关闭时,源端口将被释放回可用池。
不同的源端口不是表示有问题;增加的值仅仅是实现(和可用池)的细节。另一方面,从未关闭的连接可能是一个问题。使用netstat
命令查看TCP连接及其状态
1在具有过多的从同一远程IP快速创建连接的系统上,可能需要启用"端口重用"。
在繁忙的Linux服务器上处理TCP TIME-WAIT状态是一篇很好的文章;它包括漂亮的图表,很好的解释,以及对实际限制的讨论。
我相信你没有做错任何事。只是您误解了self。client_address
中的值self中的端口。Client_address不是服务器上的端口,而是用户机器上用于与web服务器通信的端口。
您还可以在这里查看有关端口的一些有用信息:(请勾选[正确答案])
多个客户端如何同时连接到服务器上的一个端口,比如80 ?
- 操作员”;新的“;根据我想在几个JavaScript文件中使用的类,在JavaScript中使用
- 可以't将几个数字设置为<输入类型=“;数字“>
- 当加载几个js文件时,defer属性应该如何工作
- 使用几个<脚本>标签不会't工作-只调用一个脚本
- 如何从数组中删除几个相同的项
- 包括php文件和几个js文件
- 在几个元素上模拟onclick事件
- 如何更改与Backbone集合中的模型相关联的几个元素的css属性
- 如何在几个jQuery对象上调用jQuery函数
- 用PHP/MMySQL和JavaScript填充几个HTML分区
- 点击几个按钮后动态网站更改
- d3日历视图:如何将所有内容放在一个svg中,而不是放在几个svg中
- 在JavaScriptES6中,如何从散列中只获取几个属性
- 多个 $(document).ready(function() 但只有前几个被解雇
- 为什么这个代码(同时删除几个项目)会挂在防火墙后面
- 为什么我的图像在执行这个视差脚本时跳了几个像素
- 为什么我设置cookie时有几个重复的条目
- XMLHttpRequest创建了几个出站端口——为什么?
- 为什么初始化几个变量会导致作用域泄漏
- 为什么当我使用我写的几个功能点击按钮时,我的网站上显示的图像没有消失