2016-10-05 3 views
0

К сожалению, я не могу найти ответ на этот вопрос даже после часа поиска.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() 

У меня есть два вопроса:

  1. В коде host = '127.0.0.1'. Однако, если я использую socket.gethostbyname(socket.gethostname()), я получаю ошибку сокета. Может ли кто-нибудь сказать мне, почему это так? Когда я применяю аналогичный код к внешнему компьютеру, у него не должно возникнуть проблемы с созданием сокета.

  2. Я начал поток, который работает непрерывно. Почему значение shutdown (которое объявлено после начала потока) способно остановить поток rT и разбить цикл while? Я не могу понять физику и удивлен, что она работает.

ответ

1

Я не уверен на 100% по первому вопросу, но для второго shutdown является глобальной переменной. Любые нити, порожденные из основного потока, имеют возможность видеть shutdown

Можете ли вы опубликовать ошибку сокета, которую вы получаете?

+0

Traceback (самый последний вызов последнего): Файл "C:/Users/kundemj/Desktop/Web Зачистка/client.py", строка 35, в s.sendto (псевдоним + ":" + сообщение, сервер) socket.error: [Errno 10049] Запрашиваемый адрес недействителен в его контексте –

+0

Будет ли он работать, если и моя переменная, и поток определены в классе основного потока? –

+0

@jesh Я не уверен, что понимаю ваш вопрос? что вы имеете в виду «в классе основного потока» – bravosierra99

Смежные вопросы