Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions echo.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<html>
<head>
<title>WebSocket example: echo service</title>
</head>
<body>
<h1>WebSocket example: echo service</h1>
<script type="text/javascript">
var ws = new WebSocket("ws://localhost:8080/echo");
ws.onmessage = function(evt) {
var data = evt.data;
var target = document.getElementById("received");
target.value = target.value + data;
};

ws.onopen = function(evt) {
var target = document.getElementById('conn_status');
target.value = "Connected";
};

ws.onerror = function(evt) {
target = document.getElementById('conn_status');
target.value = 'Error';
};
ws.onclose = function(evt) {
target = document.getElementById('conn_status');
target.value = 'Closed';
};

window.send_data = function() {
ws.send(document.getElementById("send_input").value);
};
</script>
<form>
<label for="send_input">Text to send</label>
<input type="text" name="send_input" id="send_input"/>
<input type="submit" name="send_submit" id="send_submit" value="Send"
onclick="send_data(); return false"/>
<br/>
<label for="received">Received text</label>
<textarea name="received" id="received"></textarea>
<br/>
<label for="status">Status</label>
<input type="text" name="status" id="conn_status" value="Not Connected"/>

</form>
</body>
</html>
14 changes: 13 additions & 1 deletion simple_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,15 @@
from twisted.web.static import File
from twisted.internet import task

from websocket import WebSocketHandler, WebSocketSite
from websocket import WebSocketHandler, WebSocketSite, WebSocketFactory

class Echo(Protocol):
def dataReceived(self, data):
print "Received data '%s'" % data.strip()
self.transport.write(data)

class EchoFactory(Factory):
protocol = Echo

class Testhandler(WebSocketHandler):
def __init__(self, transport):
Expand Down Expand Up @@ -71,6 +78,11 @@ def connectionMade(self):
root = File('.')
site = WebSocketSite(root)
site.addHandler('/test', Testhandler)

# example of wrapping a factory in order to provide WebSockets transport
echo_factory_wrapped = WebSocketFactory(EchoFactory())
site.addHandler('/echo', echo_factory_wrapped.buildHandler)

reactor.listenTCP(8080, site)
# run policy file server
factory = Factory()
Expand Down
37 changes: 36 additions & 1 deletion websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import struct

from twisted.internet import interfaces
from twisted.protocols.policies import WrappingFactory, ProtocolWrapper
from twisted.web.http import datetimeToString
from twisted.web.http import _IdentityTransferDecoder
from twisted.web.server import Request, Site, version, unquote
Expand Down Expand Up @@ -483,7 +484,41 @@ def dataReceived(self, data):
self._data.append(data)
break

class WebSocketFactory(WrappingFactory):
"""
Factory which wraps another factory to provide WebSockets transports for
all of its protocols.
"""

protocol = ProtocolWrapper

def buildHandler(self, transport):
""""
Called in order to build C{WebSocketHandler} objects.

@ivar transport: a C{WebSocketTransport} instance.
@type: L{WebSocketTransport}
"""

protocol = self.buildProtocol(transport.getHost())

handler = WebSocketHandler(transport)

def connectionMade():
protocol.makeConnection(transport)

def frameReceived(frame):
protocol.dataReceived(frame)

def connectionLost(reason):
protocol.connectionLost(reason)

handler.connectionMade = connectionMade
handler.frameReceived = frameReceived
handler.connectionLost = connectionLost

return handler


__all__ = ["WebSocketHandler", "WebSocketSite"]
__all__ = ["WebSocketHandler", "WebSocketSite", "WebSocketFactory"]