我正在尝试使用twisted编写python中的多线程服务器。 callInThread(self.task)是每次客户端从服务器请求时创建一个新线程来运行task()。当客户端逐个发送请求(全部通过端口53)时,一切正常,但是当同时有多个请求时,它会显示
文件“”,第1行,绑定 socket.error:[Errno 98]地址已在使用中
我的线程是否有错误,一次只能有一个端口使用?如果是这样,我应该如何处理我的服务器多线程? 非常感谢!
class BaseThreadedUDPServer(DatagramProtocol):
def datagramReceived(self, datagram, (host, port)):
print "received %r from %s:%d" % (datagram, host, port)
reactor.callInThread(self.task)
def task(a):
print "waiting on port:", csport
while 1:
## RCV QUERY ##
query, addr = csSocket.recvfrom(csbuf)
## GET ANS ##
ans = socket.gethostbyname(query)
## SEND ANS ##
scSocket.sendto(ans, scaddr)
def main():
print "main"
reactor.listenUDP(53, BaseThreadedUDPServer())
reactor.run()
答案 0 :(得分:2)
你不需要线程。这是可怕的马车。 Twisted已经为你调用了recv
:它是传递给datagramReceived
的结果。不要自己再打电话。你不需要一个帖子。
但是,这可能与您的问题无关。 53是默认的DNS端口:您遇到的问题是另一台服务器,可能是已在该计算机上运行的DNS服务器。尝试将53更改为其他值。
但我不太确定;在将来,请粘贴一个完整的回溯。那个追溯线显然不是来自你粘贴的例子,因为除了'class'语句之外,第1行没有任何内容。此外,由于此代码缩进错误并引发SyntaxError
,因此它显然与您正在运行的代码完全相同。
假设您实际上正在使用DNS,Twisted拥有自己的DNS服务器;您应该使用twisted.names
而不是实现自己的DNS数据包解析。