проблема при подключении двух устройств через программирование сокетов на python

#python #android #python-3.x #sockets

#python #Android #python-3.x #сокеты

Вопрос:

Я пытаюсь отправить простое сообщение со своего мобильного на свой ноутбук с помощью программирования сокетов на python. Я использую win 10 and python 3.7.4 на своем ноутбуке. Я также продолжаю работать python 3.9.0 termux .

и ноутбук подключен к точке доступа мобильного телефона.

мой server.py является:

 import threading
import os

class Server:
    def __init__(self):
        self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.accept_connections()
    
    def accept_connections(self):
        ip = socket.gethostbyname(socket.gethostname())
        port = int(input('Enter desired port --> '))

        self.s.bind((ip,port))
        self.s.listen(100)

        print('Running on IP: ' ip)
        print('Running on port: ' str(port))

        while 1:
            c, addr = self.s.accept()
            print(c)
            
            threading.Thread(target=self.handle_client,args=(c,addr,)).start()

    def handle_client(self,c,addr):
        data = c.recv(1024).decode()
    
        if not os.path.exists(data):
            c.send("file-doesn't-exist".encode())

        else:
            c.send("file-exists".encode())
            print('Sending',data)
            if data != '':
                file = open(data,'rb')
                data = file.read(1024)
                while data:
                    c.send(data)
                    data = file.read(1024)

                c.shutdown(socket.SHUT_RDWR)
                c.close()
                

server = Server()
 

и мой client.py является:

 import socket
import os

class Client:
    def __init__(self):
        self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.connect_to_server()

    def connect_to_server(self):
        self.target_ip = input('Enter ip --> ')
        self.target_port = input('Enter port --> ')

        self.s.connect((self.target_ip,int(self.target_port)))

        self.main()

    def reconnect(self):
        self.s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        self.s.connect((self.target_ip,int(self.target_port)))

    def main(self):
        while 1:
            file_name = input('Enter file name on server --> ')
            self.s.send(file_name.encode())

            confirmation = self.s.recv(1024)
            if confirmation.decode() == "file-doesn't-exist":
                print("File doesn't exist on server.")

                self.s.shutdown(socket.SHUT_RDWR)
                self.s.close()
                self.reconnect()

            else:        
                write_name = 'from_server ' file_name
                if os.path.exists(write_name): os.remove(write_name)

                with open(write_name,'wb') as file:
                    while 1:
                        data = self.s.recv(1024)

                        if not data:
                            break

                        file.write(data)

                print(file_name,'successfully downloaded.')

                self.s.shutdown(socket.SHUT_RDWR)
                self.s.close()
                self.reconnect()
                
client = Client()
 

моя проблема в том, что когда я запускаю server.py на мобильном телефоне и client.py на ноутбуке, я получаю
ConnectionRefusedError: [WinError 10061] No connection could be made because the target machine actively refused it

и когда я запускаю server.py на ноутбуке и client.py на мобильном телефоне, я получаю TimeoutError: [Errno 110] Connection timed out

*** на ноутбуке нет антивируса, а защитник Windows неактивен

*** Я также не установил на свой мобильный телефон какое-либо программное обеспечение для сетевой безопасности (но я не уверен, есть ли какое-либо предустановленное приложение)

*** также мой брандмауэр отключен.

Комментарии:

1. @fireball.1 tnx за ваш комментарий, моя пожарная стена отключена, и я не использую порт 100. Я использую что-то случайное, например 12345 , или 8080

Ответ №1:

если вы делаете это через Интернет, а не локально, вам необходимо открыть порт маршрутизатора