客户端无法连接到套接字

时间:2018-05-27 12:29:07

标签: python html sockets raspberry-pi

请保持纵容我只是从套接字开始,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文件中做错了什么?如何让它在控制台中显示值?

提前致谢。

1 个答案:

答案 0 :(得分:0)

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

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

但是firefox在调用你的服务器时期望一个协议,而且它主要是http。但似乎你的服务器没有谈论http。

只需阅读http rfc并回复您的数据,然后回复http。然后两个直接url调用firefox,javascript将工作。