python - 线程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_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]地址已在使用中”

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

最佳答案

首先,不要使用SO_REUSEADDR。有legitimate uses of SO_REUSEADDR ,但是在大多数简单情况下,它没有用,并且隐藏了真正的问题。如果需要,可以随意重新添加它,但是仅当您的程序在没有它的情况下才能添加它。

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

关于python - 线程UDP套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562604/

相关文章:

python - 我如何检查字符串是否是像 isalpha() 这样返回 bool 值的泰语

java - executor.shutdown()的使用

javascript - 在网站上运行 node.js 但不在本地主机上运行

python - 有没有办法让用户定义的 Python 函数像内置语句一样运行?

python - 绘制连接两个 swarmplots 的各个数据点的彩色线

python - Pythonista 如何在 App Store 限制下工作?

java - Scala 在线程中对待 "sharing"局部变量的方式与 Java 不同?它是如何工作的?

java - 并发测试: test case scenario automatization

java - Java 中套接字的 BufferedReader.readLine() 卡住了

javascript - 在 socket.on (socket io) 中绘制 d3 实时折线图