gpt4 book ai didi

javascript - 为什么 Node.js HTTP 服务器不响应来自 Python 的请求?

转载 作者:行者123 更新时间:2023-11-29 20:58:56 24 4
gpt4 key购买 nike

我有一个可用的 HTTP node.js 服务器。

然后我在 python 上创建了一个程序,它使用套接字模块连接到上述服务器

请暂时不要介意 try 和 except 语句。代码的 connectTO() 函数像任何其他代码一样简单地连接到服务器,除了它处理一些错误。然后程序发送消息"hello"。接下来,在 while 循环中,它反复等待一个答案,当它收到一个答案时,它会打印出来。

当我从 python 连接到 Node.js http 服务器时,我收到消息:

"You have just succesfully connected to the node.js server"

如果您查看我的代码,这意味着 s.connect(()) 命令成功。我的问题是,当一个请求被发送到服务器时,它应该输出一条消息,但它没有。

我还尝试向服务器发送消息,在这种情况下,服务器发回以下消息:

HTTP/1.1 400 Bad Request

那么为什么服务器没有响应请求呢?为什么要拒​​绝它们?

Python 客户端:

from socket import AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
import threading, socket, time, sys

s = socket.socket(AF_INET,SOCK_STREAM)

def connectTO(host,port):
connect = False
count = 0
totalCount = 0
while connect!= True:
try:
s.connect((host,port))
connect = True
print("You have just succesfully connected to the node.js server")
except OSError:
count += 1
totalCount += 1
if totalCount == 40 and count == 4:
print("Error: 404. Connection failed repeatedly")
sys.exit(0)
elif count == 4:
print("Connection failed, retrying...")
count = 0
else:
pass

connectTO("IP_OF_NODE.jS_SERVER_GOES_HERE",777)
message = "hello"
s.send(message.encode("utf-8"))

while True:
try:
data, addr = s.recvfrom(1024)
if data == "":
pass
else:
print(data.decode())
except ConnectionResetError:
print("it seems like we can't reach the server anymore..")
print("This could be due to a change in your internet connection or the server.")
s.close()

Node.js HTTP 服务器:

function onRequest(req, res) {
var postData = "";
var pathname = url.parse(req.url).pathname;

//Inform console of event recievent
console.log("Request for "+pathanme+" received.");

//Set the encoding to equivelant one used in html
req.setEncoding("utf8");

//add a listener for whenever info comes in and output full result
req.addListener("data", function(postDataChunk) {
postData += postDataChunk;
console.log("Received POST data chunk: '"+postDataChunk+"'");
});

req.addListener("end", function() {
route(handle, pathname, res, frontPage, postData);
});

};

http.createServer(onRequest).listen(port,ip);
console.log("Server has started.");

我的一些研究

我还应该注意到,经过一些研究,似乎 HTTP 服务器接受 HTTP 请求,但我不了解维基百科上的大部分内容。这是服务器没有响应的原因吗?以及如何在仍然使用 socket 模块的同时解决这个问题。

Stack Overflow 上也有很多类似的问题,但都没有帮助我解决问题。 One of them描述了我的问题,唯一的答案是关于“握手”。谷歌在这里也毫无意义,但据我了解,这只是服务器和客户端之间的 react ,它定义了协议(protocol)的内容。这可能是我所缺少的吗?我该如何实现它?

其中一些问题还使用了我尚未准备好使用的模块,例如 websocket。或者他们描述了 服务器 连接到客户端的方式,这可以通过直接调用 python 代码或从 Node.js express 连接到它来完成。我希望客户端 通过 python 中的套接字模块连接到 HTTP 服务器。为了 future 的访问者正在寻找类似的东西,这里有一些问题:


这是一个实际上看起来并不那么明显的答案,但也仅通过相关代码解决了问题。一般对服务器还不太了解的人可能会错过它: how to use socket fetch webpage use python

最佳答案

您将需要构造一个 HTTP 请求。

示例:GET/HTTP/1.1\n\n

试试这个:

from socket import AF_INET, SOCK_STREAM, SOL_SOCKET, SO_REUSEADDR
import threading, socket, time, sys

s = socket.socket(AF_INET,SOCK_STREAM)

def connectTO(host,port):
connect = False
count = 0
totalCount = 0
while connect!= True:
try:
s.connect((host,port))
connect = True
print("You have just succesfully connected to the node.js server")
except OSError:
count += 1
totalCount += 1
if totalCount == 40 and count == 4:
print("Error: 404. Connection failed repeatedly")
sys.exit(0)
elif count == 4:
print("Connection failed, retrying...")
count = 0
else:
pass

connectTO("IP_OF_NODE.jS_SERVER_GOES_HERE",777)
message = "GET / HTTP/1.1\n\n"
s.send(message.encode("utf-8"))

while True:
try:
data, addr = s.recvfrom(1024)
if data == "":
pass
else:
print(data.decode())
except ConnectionResetError:
print("it seems like we can't reach the server anymore..")
print("This could be due to a change in your internet connection or the server.")
s.close()

阅读this了解有关 HTTP 的更多信息。

现在,我建议使用 this python lib做你想做的事。它使事情变得容易得多。但是,如果您 100% 设置为使用原始套接字,那么您应该让 Node 服务器也使用原始套接字。 (假设你只会通过 python 连接)。 Here is an excellent tutorial

关于javascript - 为什么 Node.js HTTP 服务器不响应来自 Python 的请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47731485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com