簡體   English   中英

Python異步UDP服務器

[英]Python asyncore UDP server

我正在用Python編寫服務器應用程序,以偵聽請求,處理請求並發送響應。

所有請求/響應都從相同的地址和端口發送到服務器應用程序。 我需要同時接收/發送消息,而服務器需要從相同的端口和地址接收/發送消息。 我找到了一些有關異步套接字的教程,但是只有TCP連接的示例。

不幸的是,我需要UDP。 在create方法中將SOCK_STREAM更改為SOCK_DGRAM時,出現錯誤。

return getattr(self._sock,name)(*args)
socket.error: [Errno 95] Operation not supported

我嘗試使用扭曲的,但我不知道如何編寫發送方部分,該部分可以綁定到與偵聽相同的端口。 最后結果是端口被阻塞。

有什么方法可以將異步套接字與UDP一起使用,或者如何使用twisted從同一端口發送? 一些例子將被贊賞。

您幾乎可以只編寫代碼的發送和接收部分,它們就可以一起工作。 請注意,您可以在單個偵聽UDP套接字上發送和接收-不需要每個套接字(特別是如果要在同一地址發送和接收)。

from __future__ import print_function

from sys import stdout

from twisted.python.log import startLogging
from twisted.internet import reactor
from twisted.internet.protocol import DatagramProtocol

class SomeUDP(DatagramProtocol):
    def datagramReceived(self, datagram, address):
        print(u"Got a datagram of {} bytes.".format(len(datagram)))

    def sendFoo(self, foo, ip, port):
        self.transport.write(
            (u"Foo datagram: {}".format(foo)).encode("utf-8"),
            (ip, port))

class SomeSender(object):
    def __init__(self, proto):
        self.proto = proto

    def start(self):
        reactor.callLater(3, self._send)

    def _send(self):
        self.proto.sendFoo(u"Hello or whatever", b"127.0.0.1", 12345)
        self.start()

startLogging(stdout)

proto = SomeUDP()
reactor.listenUDP(12345, proto)

SomeSender(proto).start()

reactor.run()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM