Клиентская сторона не может подключиться к сокету - PullRequest
0 голосов
/ 27 мая 2018

Пожалуйста, будьте снисходительны. Я только начинаю с розеток, и это не моя сфера деятельности.

У меня RaspberryPi, подключенный к моему рабочему столу с помощью кабеля Ethernet.RPi используется в качестве веб-сервера (установлены apache2 и PHP).С рабочего стола я могу получить доступ к веб-странице по умолчанию.Пока все хорошо.

Я создал сценарий Python на RPi, который открывает сокет и посылает через него случайное число.

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()

Пока все хорошо ... Недолго,Теперь я хочу получить значения, отправленные в сокет с JS, с веб-страницы, обслуживаемой RPi.Поэтому я создал html-файл на своем RPi

<!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 голосов
/ 31 мая 2018

Я думаю, это потому, что ваш сервер не поддерживает протоколы !!!

В ваших клиентских скриптах на python также нет протокола, и он просто отображает что-либо с сервера, достаточно честно и логично, чтобы проверить, работает ли соединение.

но firefox ожидал протокол, когда он вызывает ваш сервер, и он в основном http.Но, похоже, ваш сервер не говорит http.

, просто прочитайте http rfc и ответьте вашими данными, а затем http.Тогда и прямой вызов url от firefox, и javascript будут работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...