#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]
.