gpt4 book ai didi

python - 客户端无法连接到套接字

转载 作者:行者123 更新时间:2023-12-03 12:08:25 25 4
gpt4 key购买 nike

请保持宽容,我只是从套接字开始,IT 不是我的领域。

我有一个 RaspberryPi 通过以太网电缆连接到我的桌面。
RPi 用作 Web 服务器(安装了 apache2 和 PHP)。
从桌面我可以访问默认网页。
到现在为止还挺好。

我在 RPi 上创建了一个 Python 脚本,它打开一个套接字并通过它发送随机数。

import socket
import random
import time


HOST = ''
PORT = 8080

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print 'Socket created'


try:
s.bind((HOST,PORT))
except socket.error:
print 'Bind failed'


rnd = random.random()
print rnd


s.listen(1)
print 'Socket awaiting messages'
(conn, addr) = s.accept()
print 'Connected to ' + str(addr)


while True:
rnd = random.random()
print rnd
conn.send(str(rnd))
time.sleep(1)

conn.close()

如果我执行此脚本,它会挂起,直到客户端打开连接。
因此,我从桌面打开 Firefox 并输入地址:“192.168.137.2:8080”。

Firefox 窗口中什么也没有发生,只是浏览器似乎正在等待“页面”完成加载。无论如何,从我的 RPi 上的控制台我可以看到显示的随机数。所以我假设以某种方式连接已正确打开。

奇怪的是,当我更改 time.sleep(1)time.sleep(0.01)我还可以看到 Firefox 中显示的文本...
但是让我们说没关系。

现在,如果我在 Python 中创建一个脚本并从我的桌面执行它,我可以看到两个脚本都可以工作。
import socket

HOST = "192.168.137.2"
PORT = 8080

socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect((HOST, PORT))
print "Connected"

while True:
dat = socket.recv(1024)
print str(dat)

print "Close"
socket.close()

到目前为止一切都很好......不会太久。
现在我想从 RPi 提供的网页中获取使用 JS 在套接字中发送的值。
所以我在我的 RPi 上创建了一个 html 文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test</title>
</head>

<body>
<script>
var ws = new WebSocket("ws://192.168.137.2:8080/ws");
console.log("socket created");

ws.onerror = function(err){ console.log(err); };
ws.onopen = function(){ console.log("connection opened"); };
ws.onmessage = function(e){ console.log(e.data); };
ws.onclose = function(){ console.log("connection closed"); };

</script>
</body>
</html>

如果我从我的桌面使用 Firefox 打开这个页面,我会收到这个错误(翻译成英文):
Firefox 无法与地址为 ws://192.168.137.2:8080/ws 的服务器建立连接。

从 RPi 开始,脚本停止挂起,开始显示一些值,然后崩溃,表明管道已损坏。

所以我的问题是我在 html 文件中做错了什么?如何让它在控制台中显示值?

提前致谢。

最佳答案

我认为这是因为您的服务器没有协议(protocol)支持!!!

您的 python 客户端脚本也没有协议(protocol),只显示来自服务器的任何内容,足够公平和合乎逻辑,以检查连接是否正常。

但是Firefox在调用您的服务器时需要一个协议(protocol),并且主要是http。但似乎你的服务器不说 http。

只需阅读 http rfc 并响应您的数据,然后是 http。然后通过firefox直接调用url,javascript都可以工作。

关于python - 客户端无法连接到套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50552150/

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