• B правой части каждого сообщения есть стрелки и . Не стесняйтесь оценивать ответы. Чтобы автору вопроса закрыть свой тикет, надо выбрать лучший ответ. Просто нажмите значок в правой части сообщения.

Написал чат на Python

Sevular

Member
08.01.2020
6
0
BIT
0
Проблема такая. Создал значит я локальный чат на Python где есть программа-клиент, и программа-сервер.
Клиент:
Python:
import socket, threading, time
import dns.resolver

key = 8194

shutdown = False
join = False

servak = input('Введите IP сервака: ')


def receving (name, sock):
    while not shutdown:
        try:
            while True:
                data, addr = sock.recvfrom(1024)
                

                #
                decrypt = ""; k = False
                for i in data.decode("utf-8"):
                    if i == ":":
                        k = True
                        decrypt += i
                    elif k == False or i == " ":
                        decrypt += i
                    else:
                        decrypt += chr(ord(i)^key)
                print(decrypt)
                #

                time.sleep(0.2)
        except:
            pass
host = socket.gethostbyname(socket.gethostname())
port = 0

server = (servak,9090)

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind((host,port))
s.setblocking(0)

alias = input("Ваш ник: ")

rT = threading.Thread(target = receving, args = ("RecvThread",s))
rT.start()

while shutdown == False:
    if join == False:
        s.sendto(("["+alias + "] => Присоеденился к чату ").encode("utf-8"),server)
        join = True
    else:
        try:
            message = input()

            #
            crypt = ""
            for i in message:
                crypt += chr(ord(i)^key)
            message = crypt
            #

            if message != "":
                s.sendto(("["+alias + "] :: "+message).encode("utf-8"),server)
            
            time.sleep(0.2)
        except:
            s.sendto(("["+alias + "] <= Покинул чат ").encode("utf-8"),server)
            shutdown = True

rT.join()
s.close()
Сервер:
Python:
import socket, time
import dns.resolver

host = socket.gethostbyname(socket.gethostname())
port = 9090

clients = []

s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind((host,port))

quit = False
print("[ Запущен Сервак ]")
print('ip: '+host)

while not quit:
    try:
        data, addr = s.recvfrom(1024)

        if addr not in clients:
            clients.append(addr)

        itsatime = time.strftime("%Y-%m-%d-%H.%M.%S", time.localtime())

        print("["+addr[0]+"]=["+str(addr[1])+"]=["+itsatime+"]/",end="")
        print(data.decode("utf-8"))

        for client in clients:
            if addr != client:
                s.sendto(data,client)
    except:   
        print("\n[ Сервак Отключен ]")
        quit = True
        
s.close()
При запуске нескольких клиентов и сервера на одном компьтере, все работает замечательно.
Но при запуске клиента на другом устройстве, выдаёт ошибку:
Tracebak (most recent call last):
File "client.py", line 51, in <module>
s.sendto(("["+alias + "] => Присоеденился к чату ").encode("utf-8"),server)
OSError: [Errno 22] Invalid argument
Помогите чем сможете, спасибо.
 

f22

Codeby Academy
Gold Team
05.05.2019
1 939
226
BIT
1 763
А как вы запускали? На одном компьютере запустили сервер а, на другом клиент ?
При запуске нескольких клиентов и сервера на одном компьтере, все работает замечательно.
Автор же написал понятно
 

TR1X

Green Team
04.04.2020
220
156
BIT
132
Проверьте что метод gethostbyname возвращает локальный ай пи адрес(192.168.х.х, 10.х.х.х), а не локалхост (127.0.0.1), в противном случает работать не будет. Серверу необходим локальный ай пи в одной подсети с клиентом.

host = socket.gethostbyname(socket.gethostname())
port = 0

Это из кода клиента, вы получаете адрес сервера через метод гетхост на клиенте? Тогда на другой машине адрес сервера соответственно поменяется. Попробуйте для начала прописать адрес сервера для клиента явно, в коде.
 
Последнее редактирование:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!