2016-10-05 151 views
0

不幸的是,即使经过一个小时的搜索,我仍然无法找到答案。Python - 套接字 - 网络 - 非常简单

我借这个从网上教程 - 的Youtube - Draps的

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. 我开始了一个连续运行的线程。为什么关闭值(在线程启动后声明)能够停止rT线程并中止while循环?我无法理解物理学,并惊讶它正在工作。

回答

1

我对第一个问题不是100%肯定,但对第二个问题shutdown是一个全局变量。从主线程产生的任何线程都有能力看到shutdown

你能发布你收到的套接字错误吗?

+0

回溯(最近通话最后一个): 文件 “C:/用户/ kundemj /桌面/网页抓取/ client.py” 35行,在 s.sendto(化名+ “:” +消息,服务器) socket.error:[Errno 10049]请求的地址在其上下文中无效 –

+0

如果我的变量和线程都是在一个主线程类中定义的,它还可以工作吗? –

+0

@jesh我不知道我理解你的问题吗?你的意思是“在一类主线程中” – bravosierra99