请保持纵容我只是从套接字开始,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文件中做错了什么?如何让它在控制台中显示值?
提前致谢。
答案 0 :(得分:0)
我认为这是因为您的服务器没有协议支持!!!
您的python客户端脚本也没有协议,只显示来自服务器的任何内容,公平和合理,以检查连接是否正常。
但是firefox在调用你的服务器时期望一个协议,而且它主要是http。但似乎你的服务器没有谈论http。
只需阅读http rfc并回复您的数据,然后回复http。然后两个直接url调用firefox,javascript将工作。