Подключите сервер Python к Интернету - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь создать сервер Python и получить к нему доступ через браузер с помощью любого интернет-соединения из любой точки мира. В настоящее время у меня есть следующий код, который я получил от учебников YouTube:

import socket
from _thread import *

host=''
port=5555
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

try:
    s.bind((host,port))
except socket.error as e:
    print(str(e))

s.listen(5)
print("Waiting for a connection")

def threadedClient(conn):
    conn.send(str.encode('Welcome, type your info\n'))

    storeStr = 'Server Output:'

    while True:
        data = conn.recv(2048)
        reply = data.decode('utf-8')
        if not data:
            break
        for x in reply:
            if x=='\n':
                conn.sendall(str.encode(storeStr))
                storeStr = 'Server Output:'
            else:
                storeStr=storeStr+reply
                print(storeStr)


    conn.close()

while True:
    conn, addr = s.accept()
    print('connected to:'+addr[0]+':'+str(addr[1]))

    start_new_thread(threadedClient,(conn,))

Используя этот код, я могу подключаться к серверу и взаимодействовать с ним через командную строку. Однако попытка подключения через браузер приводит к:

GET / HTTP/1.1
Host: 192.168.1.56:5555
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 
like Gecko) Chrome/67.0.3396.87 Safari/537.36
Accept: 
text/html,application/xhtml+xml,
application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,en-GB;q=0.8


Unhandled exception in thread started by <function threadedClient at 
0x0000027B86E0C2F0>  

Я попытался изменить строки, отправляемые на более HTTP-подобные строки, такие как «POST / HTTP / 1.1» или «Test», но это ничего не меняет.

Кроме того, я настроил переадресацию портов для своего ноутбука на своем маршрутизаторе, и мне было интересно, нужно ли предпринимать дальнейшие действия для работы WAN. Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Хорошо, теперь у меня есть файловый сервер HTTP, снова взятый из руководства по YouTube.Ниже приведен код:

from http.server import HTTPServer, BaseHTTPRequestHandler

class Serv(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path=='/':
            self.path='/index.html'
        try:
            file_to_open=open(self.path[1:]).read()
            self.send_response(200)
        except:
            file_to_open='file not found'
            self.send_response(404)
        self.end_headers()
        self.wfile.write(bytes(file_to_open,'utf-8'))

httpd=HTTPServer(('192.168.1.56',8081),Serv)
httpd.serve_forever()  

Я предполагаю, что отсутствие библиотеки сокетов объясняется тем, что сокеты обрабатываются библиотекой HTTPServer.Но я все еще не уверен, как подключить это к глобальной сети.Я выполнил настройку переадресации портов, необходимую на моем маршрутизаторе, но порт все еще закрыт, когда я проверил yougetsignal.com.Для переадресации портов у меня есть IP 192.168.1.56, перенаправленный на порт 8081 с использованием TCP.У меня есть назначенный вручную IP-адрес для ноутбука, который не должен перекрываться с любым другим устройством в сети, поскольку IP-адрес был первоначально получен через DHCP.Есть ли что-то еще, что я должен сделать с кодом?Или, возможно, есть способ использовать сокеты с HTTPServer для достижения результата, так как документации для библиотеки http.server не так много ...

0 голосов
/ 25 июня 2018

Telnet , который вы используете для подключения к вашему серверу Python, является (довольно простым) текстовым протоколом.По сути, он отправляет данные ASCII.

HTTP , который использует ваш веб-браузер, является гипертекстовым протоколом.Таким образом, он может отправлять данные, которые ваш сервер не может интерпретировать (или неправильно интерпретировать).Если вы хотите получить доступ к вашему серверу через веб-браузер, вам необходимо реализовать протокол http (или хотя бы его часть).

...