Сокеты Python не подключаются

#python-3.x #sockets #tkinter #python-sockets

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

Вопрос:

Я создаю приложение для обмена сообщениями, я могу получить два скрипта для подключения и обмена данными на одном компьютере, но на двух отдельных машинах в одной локальной сети они вообще не подключаются. Я создал исключение брандмауэра на обоих компьютерах для программы, но это не помогает.

Хост просто зависает, пока он прослушивает соединение от клиента, которое никогда не приходит, и клиент в конечном итоге отключается, сообщая, что ответа не было или неправильный ответ после минуты ожидания.

 import socket
from threading import Thread
import tkinter as tk

default_port = 43777
self_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

def client_link():
    self_socket.connect((join_ip_input.get("1.0", "end-1c"), default_port))
    create_messenging_screen()
    self_socket.sendall(("hi to you too").encode("utf-8"))
    while True:
        try:
            print(self_socket.recv(1024))
        except:pass

def host_link():
    self_socket.bind((socket.gethostbyname(socket.gethostname()), default_port))

    self_socket.listen(1)

    global client_conn
    client_conn, client_addr = self_socket.accept()
    create_messenging_screen()

    client_conn.sendall(("hi").encode("utf-8"))
    print(client_addr)

    while True:
        try:
            print(client_conn.recv(1024))
        except:pass

def continue_setup(route):
    if route == None:
        Thread(target=host_link).start()
    else:

        Thread(target=client_link).start()


def create_messenging_screen():
   #clear the window and create the messaging GUI

window = tk.Tk()
#IM app connection screen

#host a chatroom
button(window, command=lambda: continue_setup(None))
#join a chatroom
join_ip_input = tk.Text(window)
button(window, command=lambda: continue_setup(1))

window.mainloop()
  

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

1. У меня есть две машины с Windows, я использую локальный IP-адрес, который socket.gethostbyname (socket.gethostname() дает мне для создания сокета хост-машины

2. Убедитесь, что выходные данные socket.gethostbyname(socket.gethostname()) на стороне сервера совпадают с входными данными на стороне клиента. Также лучше изменить join_ip_input.get("1.0", "end-1c") на join_ip_input.get("1.0", "end-1c").strip('n') , чтобы удалить неожиданные завершающие символы новой строки. Я протестировал ваш код (после исправления некоторых проблем с опечатками, как button должно быть tk.Button ), и это работает.

Ответ №1:

Оказывается, на моем компьютере было два сетевых адаптера, и тот, который использовался модулем сокета по умолчанию, не работал, поэтому я указал другой, используя это: socket.gethostbyname_ex(socket.gethostname())[2][1] .