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

Привет, я сделал это приложение для файлового сервера, открыл сервер на одном ноутбуке и открыл клиентскую программу на другом ноутбуке, но не смог подключиться к серверу.оба ноутбука подключены к одному и тому же Wi-Fi, поэтому он не должен работать?и если я открою сервер и клиентскую программу на одном ноутбуке, клиент сможет подключиться к серверу.

вот мой код

Сервер

import threading
import os
import socket

def RetrFile(name, sock):
    filename = str(sock.recv(1024), 'utf-8')
    print(filename)
    if os.path.isfile(filename):
        sock.send(bytes("EXISTS" + str(os.path.getsize(filename)), 'utf-8'))
        userResponse = str(sock.recv(1024), 'utf-8')
        if userResponse[:2] == 'Ok':
            with open(filename, 'rb') as f:
                bytesToSend = f.read(1024)
                sock.send(bytesToSend)
                while bytesToSend != "":
                    bytesToSend=f.read(1024)
                    sock.send(bytesToSend)
    else:
        sock.send(bytes("ERR", 'utf-8'))
    sock.close()

def Main():
    host = socket.gethostbyname("localhost")
    port = 5123
    s = socket.socket()
    s.bind(('0.0.0.0', port))
    s.listen(5)
    print("Server started")
    while True:
        c, addr = s.accept()
        print("Client connected" + str(addr))
        t = threading.Thread(target=RetrFile, args=("rthread", c))
        t.start()
    s.close()

Main()

Клиент

import socket

def Main():
    host = socket.gethostbyname("localhost")
    port = 5123

    s= socket.socket()
    s.connect((host, port))

    filename = input("Filename? ->")
    if filename != 'q':
        s.send(bytes(filename,'utf-8'))
        data=str(s.recv(1024),'utf-8')
        if data[:6] == 'EXISTS':
            filesze = data[6:]
            message = input("File Exists" + filesze + "(Y/N)")

            if message == 'Y':
                s.send(bytes("Ok",'utf-8'))
                f = open('new_'+filename, 'wb')
                data = s.recv(1024)
                total = len(data)
                f.write(data)
                while total < int(filesze):
                    data = s.recv(1024)
                    total+= len(data)
                    f.write(data)
                    print('%.2f' %((total/int(filesze)*100)), " percentage complted ")
                print("Download Complete")
        else:
            print("doesnt exist")

    s.close()
Main()

1 Ответ

0 голосов
/ 08 мая 2018

Вы, кажется, неправильно понимаете значение слова "localhost". Это всегда относится только к тому компьютеру, на котором вы находитесь. Поэтому для клиента localhost разрешается сам, а на сервере localhost ссылается на себя. Следовательно, клиент ищет сервер, работающий на своем собственном компьютере, через порт 5123, который, конечно, дает сбой, потому что сервер работает не на том же компьютере, а в другом месте. Вот почему код работает, когда сервер и клиент находятся на одном компьютере.

Вам необходимо получить IP-адрес или имя хоста серверного ноутбука, чтобы подключиться к нему с клиента. Вы можете получить это, запустив hostname на компьютере-сервере в терминале Linux или командной строке Windows и вставив это имя вместо "localhost" в код, который выполняется на клиентском компьютере.

Например, на сервере ноутбук в терминале:

$ hostname
myserver

А в коде вашего клиента:

host = socket.gethostbyname("myserver")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...