<p>恭喜你对Python的介绍!看起来您使用的是python3,在以后的问题中,如果您清楚地知道您使用的是哪个版本,这将很有帮助,因为有些代码(包括这段代码!)中存在轻微但会破坏程序的不兼容性。在</p>
<p>我在你的程序中发现了一些错误:</p>
<ul>
<li><p>最主要的问题是,正如特雷弗·巴恩威尔所说,你打电话给<code>threading.Thread</code>并不太正确。<code>target=</code>参数需要是一个可调用的对象(即函数),但在本例中它应该只是对函数的引用。如果您像上面一样给函数<code>self.create_socket(host, port)</code>添加括号,它实际上会立即运行函数。正如Trevor所解释的,您的<code>Sending.send()</code>方法很早就被调用了,但是<code>Receiving</code>中还有一个类似的bug。因为接收.create_套接字()创建无限循环,它从不返回程序执行。虽然控制台输出在用户看来是正确的,但实际的程序执行从来没有让它在单独的线程中运行侦听器。</p></li>
<li><p><code>bytearray.extend()</code>接受一个int的iterable,现在传递的是字节对象的元组。</p></li>
<li><p>在<code>Sending.send()</code>中,您调用了<code>self.sock</code>,但是您从未给<code>self.sock</code>赋值,所以它失败了。</p></li>
<li><p><code>Sending.run()</code>只运行<code>Sending.send()</code>一次。在为用户完成输入后,它会立即退出,因为程序已经完成。</p></li>
</ul>
<p>如果您正在寻找一个适合有经验的程序员的基于项目的深入介绍Python(包括一个与这个问题非常相似的关于基本套接字的练习,另一个关于线程的练习),我强烈建议您查看Wesley Chun的“Core Python Applications Programming”。最新的版本(第3版)有很多python2代码,但是它很容易移植到python3,读者只需要做一些小的工作。在</p>
<p>我试图尽可能少地修改您的代码以使其正常工作,如下所示:</p>
<pre><code>import socket
import threading
import logging
import time
class Sending():
def __init__(self, name, tHost, tPort, target):
self.name = name
self.host = tHost
self.port = tPort
self.target_port = target
self.sock = self.create_socket()
def create_socket(self):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((self.host, self.port))
return sock
def set_name(self, name):
self.name = name
def send_loop(self):
while True:
logging.debug('Starting send run')
message = input('Enter message: ')
data = bytearray()
data.extend(message.encode('utf-8'))
self.sock.sendto(bytearray(data), (self.host, self.target_port))
def run(self):
th2 = threading.Thread(name='send', target=self.send_loop)
th2.start()
class Receiving():
def __init__(self, host, port):
self.host = host
self.port = port
def create_socket(self):
logging.debug('Starting socket')
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((self.host, self.port))
print ('socket ready')
time.sleep(5)
while True:
data, addr = sock.recvfrom(1500)
print('\nPrijata:' + data.decode('utf-8') + str(addr))
def run(self):
th1 = threading.Thread(name='rec', target=self.create_socket)
print("Made it here")
th1.daemon = True
th1.start()
return
if __name__ == '__main__':
print('running')
rec = Receiving('localhost', 8000)
send = Sending('username', 'localhost', 8001, 8000)
rec.run()
send.run()
</code></pre>