Клиенты не получают данные с сервера python

Я новичок в Python. Я пишу серверную программу и клиентскую программу. Здесь сервер играет роль распределения данных среди нескольких клиентов. Это прекрасно работает. Моя задача — раздать данные с сервера с помощью файла server.py. Всякий раз, когда клиенты этого хотят, он просто запускает client.py на своем ноутбуке и получает результаты. Но здесь Сервер начинает раздавать данные. IP-адрес, который использовал сервер, был 127.0.1.1. Он не принимает предоставленный сетью ip. Как заставить его использовать IP-адрес, предоставленный локальной сетью. Когда клиенты с другого компьютера запускают файл client.py. Он показывает ошибку отказа в соединении. Обратите внимание, что мы все подключены к локальной сети. Как это решить и заставить клиентов получать данные.

Вот пример кода клиента:

import socket
import os
from threading import Thread


import socket
import time

s = socket.socket()  
host = '127.0.1.1'  
port = 10016
print(host)


s.connect((host, port))
while True:
    print(s.recv(1024))
s.close() 

Пример кода сервера:

import socket
import os
from threading import Thread
import thread
import threading
import time
import datetime

def listener(client, address):
    print ("Accepted connection from: ", address)
    with clients_lock:
        clients.add(client)
    try:    
        while True: 
            client.send(a)
            time.sleep(2)   

    finally:
        with clients_lock:
            clients.remove(client)
            client.close()

clients = set()
clients_lock = threading.Lock()

host = socket.gethostname()
port = 10016

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(3)
th = []
print ("Server is listening for connections...")
while True:
    client, address = s.accept()
    timestamp = datetime.datetime.now().strftime("%b %d %Y,%a, %I:%M:%S %p")
    a = "Hi Steven!!!" + timestamp
    th.append(Thread(target=listener, args = (client,address)).start())
s.close()

person Smack Alpha    schedule 22.03.2019    source источник
comment
Используйте адрес хоста 0.0.0.0 на сервере.   -  person Klaus D.    schedule 22.03.2019
comment
Нет. Он по-прежнему показывает ошибку «Отказано в подключении» на стороне клиента.   -  person Smack Alpha    schedule 22.03.2019
comment
Вы пробовали использовать 127.0.1.1 вместо seocket.gethostname?   -  person Fejs    schedule 22.03.2019
comment
Да... пробовал 127.0.1.1   -  person Smack Alpha    schedule 22.03.2019
comment
клиентский файл py работает только на серверном компьютере, где выполняется файл server.py. как заставить его работать на других компьютерах в локальной сети   -  person Smack Alpha    schedule 22.03.2019
comment
IIRC, вы используете socket.bind(("", port)) для серверной части. Обратите внимание на пустую строку для хоста. Затем для клиента вы используете socket.connect((host_or_ip, port)), где host_or_ip НЕ 127.0.0.1, так как на клиентской машине 127.0.0.1 будет относиться к его собственной машине.   -  person Justin Ezequiel    schedule 22.03.2019
comment
Это не работает... я пытался использовать пустую строку на хосте. Все еще на стороне клиента, он показывает ошибку   -  person Smack Alpha    schedule 22.03.2019
comment
Конечно, клиентам также придется подключаться к внешнему IP-адресу сервера. 127.* адреса используются только на внутреннем петлевом интерфейсе, а не в локальной сети.   -  person Klaus D.    schedule 22.03.2019
comment
тогда как можно поделиться этими данными по локальной сети?   -  person Smack Alpha    schedule 22.03.2019


Ответы (2)


настройте IP-адрес, предоставленный локальной сетью, на client.py (IP-адрес в локальной сети, например: 192.168.122.33)

host = 'ip provided by LAN'
person mtkiller    schedule 22.03.2019
comment
Нет, не подключается. Все равно показывает ошибку подключения. Мои данные были запущены на сервере ip. - person Smack Alpha; 22.03.2019
comment
Возможно ли, что ваш клиент не может получить доступ к серверу в локальной сети? Закрыт ли брандмауэр? - person mtkiller; 22.03.2019
comment
вы можете попробовать это в оболочке: telnet ipinlan 10016 - person mtkiller; 22.03.2019
comment
telnet: не удалось разрешить ошибку ipinlan/10016: имя или служба неизвестна - person Smack Alpha; 22.03.2019
comment
и статус брандмауэра был неактивен - person Smack Alpha; 22.03.2019

Наконец нашел ответ

В содержимом файла «/etc/hosts» у меня есть сопоставление IP-адреса с «127.0.1.1» с моим именем хоста. Это приводит к тому, что разрешение имени становится 127.0.1.1. Я прокомментировал эту строку. Теперь это работает. Каждый в моей локальной сети может получать данные

Код сервера:

import socket
import os
from threading import Thread
import threading
import time
import datetime

def listener(client, address):
    print ("Accepted connection from: ", address)
    with clients_lock:
        clients.add(client)
    try:    
        while True: 
            client.send(a)
            time.sleep(2)   

    finally:
        with clients_lock:
            clients.remove(client)
            client.close()

clients = set()
clients_lock = threading.Lock()

host = socket.getfqdn()  # it gets ip of lan
port = 10016

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(3)
th = []
print ("Server is listening for connections...")
while True:
    client, address = s.accept()
    timestamp = datetime.datetime.now().strftime("%b %d %Y,%a, %I:%M:%S %p")
    a = ("Hi Steven!!!" + timestamp).encode()
    th.append(Thread(target=listener, args = (client,address)).start())
s.close()

Код клиента:

import socket
import os
import time

s = socket.socket()  
host = '192.168.1.43' #my server ip 
port = 10016
print(host)
print(port)

s.connect((host, port))
while True:
    print((s.recv(1024)).decode())
s.close() 
person Smack Alpha    schedule 22.03.2019