Python 线程UDP套接字

Python 线程UDP套接字,python,multithreading,sockets,udp,Python,Multithreading,Sockets,Udp,我正在尝试用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_

我正在尝试用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()
#/usr/bin/python
#-*-编码:Utf-8-*-
导入系统
导入套接字
从线程导入开始新线程
类代理():
def __;初始化(自身、ip、端口):
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=端口
self.s.bind((ip,端口))
self.listclients=[]
def listenMod(b):
dic={}
msg,ip=b.s.recvfrom(1024)
dic[msg]=ip
b、 listclients.append(dic)
打印消息“已连接”
def代理(arg):
尝试:
b=代理(arg[2],int(arg[3]))
启动新线程(listenMod,(b,))
除例外情况外,e:
打印e
系统出口(-1)
def客户端(arg):
尝试:
通过
除:
通过
def用法():
打印“用法。/udps.py”
打印“-b\t服务器模式\n\t:主机端口”
sys.exit()
def main():
i=1
如果len(sys.argv)>1:
而i
它总是打印“[Errno 48]地址已在使用”


我之所以使用它,是因为我希望能够与我的客户一起做一些特殊的事情,同时也能够连接新客户。

首先,不要使用
,所以请重新使用EADDR
。有,但在大多数简单的情况下,它是没有用的,它隐藏了真正的问题。如果需要,您可以随意重新添加它,但仅当您的程序在没有它的情况下工作时


您的问题在
中。您在参数数量上循环,但从不增加
i
,因此它会无限循环。此外,您总是在测试argv[1]
。如果有4个参数,第二个参数是'-b',那么您将调用
broker()
4次,这显然不起作用。另外,请注意,如果循环结束且主出口退出,则程序将立即终止,因此您至少应该在循环结束时添加
while(True):sleep(5)
,但这不是解决方案。

是否多次调用
代理()
?您不能将套接字多次绑定到一个端口……也许您会显示更多与
broker()
的使用相关的代码。不,我不知道。实际上,如果我不使用:start\u new\u thread(listenMod,(b,)),但只使用:listenMod(b)哪一行代码失败了?你能提供一个完整的示例程序吗?你必须展示这个类是如何被使用的。您不能两次绑定到同一端口号-一个端口只能绑定一个套接字。启动新线程(listenMod,(b,))会使我的代码失败。我给我的类构造函数打了一次电话。谢谢你的回答。我使用SO_REUSEADDR是因为我的代码设计用于制作UDP打孔原型。@ZeenaZeek打孔不需要SO_REUSEADDR。但是,如果您的实现需要它,这不是问题。所以dr本身并不坏,只要记住它可以隐藏潜在的问题。