К сожалению, я не могу найти ответ на этот вопрос даже после часа поиска.Python - Socket - Networking - Very Simple
Я заимствовал это от онлайновых обучающих - Youtube -
Замена постельного бельяimport socket, threading, time, wx
tLock = threading.Lock()
shutdown = False
def receiving(name, sock):
while not shutdown:
try:
tLock.acquire()
#while True:
data, addr = sock.recvfrom(1024)
print str(data) + "hehehe"
except:
pass
finally:
tLock.release()
host = '127.0.0.1'
port = 0
server = ('127.0.0.1', 5000)
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((host,port))
s.setblocking(0)
rT = threading.Thread(target = receiving, args = ("RecvThread", s))
rT.start()
alias = raw_input("Name: ")
message = raw_input(alias + "-->")
while message != 'q':
if message != '':
s.sendto(alias + ":" + message, server)
tLock.acquire()
message = raw_input(alias + "-->")
tLock.release()
time.sleep(0.2)
shutdown = True
rT.join()
s.close()
У меня есть два вопроса:
В коде
host = '127.0.0.1'
. Однако, если я используюsocket.gethostbyname(socket.gethostname())
, я получаю ошибку сокета. Может ли кто-нибудь сказать мне, почему это так? Когда я применяю аналогичный код к внешнему компьютеру, у него не должно возникнуть проблемы с созданием сокета.Я начал поток, который работает непрерывно. Почему значение shutdown (которое объявлено после начала потока) способно остановить поток rT и разбить цикл while? Я не могу понять физику и удивлен, что она работает.
Traceback (самый последний вызов последнего): Файл "C:/Users/kundemj/Desktop/Web Зачистка/client.py", строка 35, в s.sendto (псевдоним + ":" + сообщение, сервер) socket.error: [Errno 10049] Запрашиваемый адрес недействителен в его контексте –
Будет ли он работать, если и моя переменная, и поток определены в классе основного потока? –
@jesh Я не уверен, что понимаю ваш вопрос? что вы имеете в виду «в классе основного потока» – bravosierra99