started with Python 3.4 and asyncio support
This commit is contained in:
parent
25ca03376f
commit
89fe4a46e8
|
@ -6,3 +6,4 @@
|
||||||
/autobahn/autobahn.egg-info*/
|
/autobahn/autobahn.egg-info*/
|
||||||
doc/_build/*
|
doc/_build/*
|
||||||
*.sublime-workspace
|
*.sublime-workspace
|
||||||
|
__pycache__
|
||||||
|
|
|
@ -16,23 +16,26 @@
|
||||||
##
|
##
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
from _version import __version__
|
# from _version import __version__
|
||||||
version = __version__ # backward compat.
|
# version = __version__ # backward compat.
|
||||||
|
|
||||||
import util
|
# import util
|
||||||
import choosereactor
|
# import choosereactor
|
||||||
import useragent
|
# import useragent
|
||||||
import flashpolicy
|
# import flashpolicy
|
||||||
import httpstatus
|
# import httpstatus
|
||||||
import utf8validator
|
# import utf8validator
|
||||||
import xormasker
|
# import xormasker
|
||||||
import compress
|
# import compress
|
||||||
import websocket
|
# import websocket
|
||||||
|
|
||||||
## disable import, since it leads to reactor import
|
# ## disable import, since it leads to reactor import
|
||||||
## https://twistedmatrix.com/trac/ticket/6849
|
# ## https://twistedmatrix.com/trac/ticket/6849
|
||||||
#import resource
|
# #import resource
|
||||||
|
|
||||||
import prefixmap
|
# import prefixmap
|
||||||
import wamp
|
# import wamp
|
||||||
import wamp2
|
# import wamp2
|
||||||
|
|
||||||
|
#import twisted
|
||||||
|
#import asyncio
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
###############################################################################
|
||||||
|
##
|
||||||
|
## Copyright 2011-2013 Tavendo GmbH
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
from asyncio import Protocol
|
||||||
|
|
||||||
|
|
||||||
|
class AdapterProtocol(Protocol):
|
||||||
|
|
||||||
|
def connection_made(self, transport):
|
||||||
|
peername = transport.get_extra_info('peername')
|
||||||
|
print('connection from {}'.format(peername))
|
||||||
|
self._protocol.transport = transport
|
||||||
|
|
||||||
|
def data_received(self, data):
|
||||||
|
self._protocol.data_received(data)
|
||||||
|
#print('data received: {}'.format(data.decode()))
|
||||||
|
#self.transport.write(data)
|
||||||
|
#self.transport.close()
|
||||||
|
|
||||||
|
|
||||||
|
class AdapterFactory:
|
||||||
|
|
||||||
|
def __init__(self, factory, loop = None):
|
||||||
|
self._factory = factory
|
||||||
|
|
||||||
|
if loop is None:
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
self._loop = loop
|
||||||
|
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
proto = AdapterProtocol()
|
||||||
|
proto.factory = self
|
||||||
|
proto._protocol = self._factory()
|
||||||
|
print("asyncio protocol created")
|
||||||
|
return proto
|
|
@ -0,0 +1,53 @@
|
||||||
|
###############################################################################
|
||||||
|
##
|
||||||
|
## Copyright 2011-2013 Tavendo GmbH
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
|
from twisted.internet.protocol import Protocol, Factory
|
||||||
|
|
||||||
|
|
||||||
|
class AdapterProtocol(Protocol):
|
||||||
|
|
||||||
|
def connectionMade(self):
|
||||||
|
peername = str(self.transport.getPeer())
|
||||||
|
print('connection from {}'.format(peername))
|
||||||
|
self._protocol.transport = self.transport
|
||||||
|
|
||||||
|
def dataReceived(self, data):
|
||||||
|
self._protocol.data_received(data)
|
||||||
|
#print('data received: {}'.format(data.decode()))
|
||||||
|
#self.transport.write(data)
|
||||||
|
#self.transport.loseConnection()
|
||||||
|
|
||||||
|
|
||||||
|
class AdapterFactory(Factory):
|
||||||
|
|
||||||
|
def __init__(self, factory, reactor = None):
|
||||||
|
self._factory = factory
|
||||||
|
|
||||||
|
## lazy import to avoid reactor install upon module import
|
||||||
|
if reactor is None:
|
||||||
|
from twisted.internet import reactor
|
||||||
|
self._reactor = reactor
|
||||||
|
|
||||||
|
|
||||||
|
def buildProtocol(self, addr):
|
||||||
|
proto = AdapterProtocol()
|
||||||
|
proto.factory = self
|
||||||
|
proto._protocol = self._factory()
|
||||||
|
print("twisted protocol created")
|
||||||
|
return proto
|
|
@ -0,0 +1,19 @@
|
||||||
|
###############################################################################
|
||||||
|
##
|
||||||
|
## Copyright 2013 Tavendo GmbH
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
#import protocol
|
|
@ -0,0 +1,39 @@
|
||||||
|
###############################################################################
|
||||||
|
##
|
||||||
|
## Copyright 2011-2013 Tavendo GmbH
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
class WebSocketServerProtocol:
|
||||||
|
|
||||||
|
def data_received(self, data):
|
||||||
|
print('data received: {}'.format(data.decode()))
|
||||||
|
self.onMessage(data, False)
|
||||||
|
|
||||||
|
def onMessage(self, payload, isBinary):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def sendMessage(self, payload, isBinary = False):
|
||||||
|
self.transport.write(payload)
|
||||||
|
|
||||||
|
|
||||||
|
class WebSocketServerFactory:
|
||||||
|
|
||||||
|
protocol = WebSocketServerProtocol
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
proto = self.protocol()
|
||||||
|
proto.factory = self
|
||||||
|
return proto
|
|
@ -0,0 +1,8 @@
|
||||||
|
server1_asyncio:
|
||||||
|
PYTHONPATH=../../autobahn python3 server.py asyncio
|
||||||
|
|
||||||
|
server1_twisted:
|
||||||
|
PYTHONPATH=../../autobahn python server.py twisted
|
||||||
|
|
||||||
|
client1_asyncio:
|
||||||
|
PYTHONPATH=../../autobahn python3 client.py
|
|
@ -0,0 +1,40 @@
|
||||||
|
###############################################################################
|
||||||
|
##
|
||||||
|
## Copyright 2011-2013 Tavendo GmbH
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
class EchoClient(asyncio.Protocol):
|
||||||
|
|
||||||
|
message = 'This is the message. It will be echoed.'
|
||||||
|
|
||||||
|
def connection_made(self, transport):
|
||||||
|
transport.write(self.message.encode())
|
||||||
|
print('data sent: {}'.format(self.message))
|
||||||
|
|
||||||
|
def data_received(self, data):
|
||||||
|
print('data received: {}'.format(data.decode()))
|
||||||
|
|
||||||
|
def connection_lost(self, exc):
|
||||||
|
print('server closed the connection')
|
||||||
|
asyncio.get_event_loop().stop()
|
||||||
|
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
coro = loop.create_connection(EchoClient, '127.0.0.1', 8888)
|
||||||
|
loop.run_until_complete(coro)
|
||||||
|
loop.run_forever()
|
||||||
|
loop.close()
|
|
@ -0,0 +1,75 @@
|
||||||
|
###############################################################################
|
||||||
|
##
|
||||||
|
## Copyright 2011-2013 Tavendo GmbH
|
||||||
|
##
|
||||||
|
## Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
## you may not use this file except in compliance with the License.
|
||||||
|
## You may obtain a copy of the License at
|
||||||
|
##
|
||||||
|
## http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
##
|
||||||
|
## Unless required by applicable law or agreed to in writing, software
|
||||||
|
## distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
## See the License for the specific language governing permissions and
|
||||||
|
## limitations under the License.
|
||||||
|
##
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
from autobahn.websocket2.protocol import WebSocketServerProtocol, WebSocketServerFactory
|
||||||
|
|
||||||
|
|
||||||
|
class MyServerProtocol(WebSocketServerProtocol):
|
||||||
|
|
||||||
|
def onMessage(self, payload, isBinary):
|
||||||
|
print("message received")
|
||||||
|
self.sendMessage(payload)
|
||||||
|
|
||||||
|
|
||||||
|
class MyServerFactory(WebSocketServerFactory):
|
||||||
|
|
||||||
|
protocol = MyServerProtocol
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def run_test_asyncio(factory):
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
from autobahn.asyncio import AdapterFactory
|
||||||
|
|
||||||
|
loop = asyncio.get_event_loop()
|
||||||
|
coro = loop.create_server(AdapterFactory(factory), '127.0.0.1', 8888)
|
||||||
|
server = loop.run_until_complete(coro)
|
||||||
|
print('serving on {}'.format(server.sockets[0].getsockname()))
|
||||||
|
|
||||||
|
try:
|
||||||
|
loop.run_forever()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("exit")
|
||||||
|
finally:
|
||||||
|
server.close()
|
||||||
|
loop.close()
|
||||||
|
|
||||||
|
|
||||||
|
def run_test_twisted(factory):
|
||||||
|
from twisted.internet.endpoints import TCP4ServerEndpoint
|
||||||
|
from twisted.internet import reactor
|
||||||
|
|
||||||
|
from autobahn.twisted import AdapterFactory
|
||||||
|
|
||||||
|
endpoint = TCP4ServerEndpoint(reactor, 8888)
|
||||||
|
endpoint.listen(AdapterFactory(factory))
|
||||||
|
reactor.run()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
import sys
|
||||||
|
|
||||||
|
factory = MyServerFactory()
|
||||||
|
|
||||||
|
if sys.argv[1] == "asyncio":
|
||||||
|
run_test_asyncio(factory)
|
||||||
|
elif sys.argv[1] == "twisted":
|
||||||
|
run_test_twisted(factory)
|
||||||
|
else:
|
||||||
|
raise Exception("no such variant")
|
Loading…
Reference in New Issue