【发布时间】:2015-02-18 04:28:08
【问题描述】:
我正在尝试使用 python 制作多线程 udp 服务器。
这是我正在做的事情:
#!/usr/bin/python
# -*- coding:Utf-8 -*-
import sys
import socket
from thread import start_new_thread
class Broker():
def __init__(self, ip, port):
self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.ip = ip
self.port = port
self.s.bind((ip, port))
self.listclients = []
def listenMod(b):
dic = {}
msg, ip = b.s.recvfrom(1024)
dic[msg] = ip
b.listclients.append(dic)
print msg, " is connected."
def broker(arg):
try:
b = Broker(arg[2], int(arg[3]))
start_new_thread(listenMod, (b, ))
except Exception, e:
print e
sys.exit(-1)
def client(arg):
try:
pass
except:
pass
def usage():
print "usage ./udps.py <-b|-c> <args>"
print "-b\tserver mode\n\t<args>: host port"
sys.exit()
def main():
i = 1
if len(sys.argv) > 1:
while i < len(sys.argv):
if sys.argv[1] == "-b":
broker(sys.argv)
elif sys.argv[1] == "-c":
pass
else:
usage()
else:
usage()
if __name__ == '__main__':
main()
它总是打印“[Errno 48] 地址已在使用中”
我使用它是因为我希望能够与我的客户一起做一些特殊的事情,但也能够同时连接新客户。
【问题讨论】:
-
您是否多次致电
broker()?你不能多次将一个套接字绑定到一个端口……也许你再展示一些代码,与broker()的用法有关。 -
不,我没有。实际上,如果我不使用它会起作用:start_new_thread(listenMod, (b, )) 但只是:listenMod(b)
-
你的哪一行代码失败了?你能提供一个完整的工作示例程序吗?
-
你必须展示这个类是如何被使用的。您不能两次绑定到同一个端口号 - 一个端口只能绑定一个套接字。
-
start_new_thread(listenMod, (b, )) 使我的代码失败。我调用了我的类构造函数一次。
标签: python multithreading sockets udp