I were just trying to use WebSockets. i wrote server code in python. The server is running fine but when tried to connect to the socket using browser, I'm getting the error
"WebSocket connection to 'ws://localhost:9876/' failed: Received unexpected continuation frame"
When referring on internet, I understood it is something related to framing of data that sent from the server. I've tried to follow these (rfc6455) standards when sending a data, even I can't achieve a websocket connection. Almost similar question is asked here, but it is an old post also the solution is not clear.
This is my pretty simple server code..
import socket
def handle(s):
print repr(s.recv(4096))
s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
s.bind(('',9876))
s.listen(2)
handshakes='\
HTTP/1.1 101 Web Socket Protocol Handshake\r\n\
Upgrade: WebSocket\r\n\
Connection: Upgrade\r\n\
Sec-WebSocket-Origin: null\r\n\
Sec-WebSocket-Location: ws://localhost:9876/\r\n\
'
def handshake(hs):
hslist = hs.split('\r\n')
body = hs.split('\r\n\r\n')[1]
key = ''
cc = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'
for h in hslist:
if h.startswith('Sec-WebSocket-Key:'):
key = h[19:]
else:
continue
import hashlib
import base64
s = hashlib.sha1()
s.update(key+cc)()
h = s.digest()
return base64.b64encode(h)
def sender(data, conn):
first_byte = chr(0x00)
payload = data.encode('utf-8')
pl = first_byte + payload + chr(0xFF)
conn.send(pl)
while True:
c,a = s.accept()
msg = c.recv(4096)
if(msg):
print msg
print 'sending handshake ...'
handshakes += 'Sec-WebSocket-Accept: '+str(handshake(msg))+'\r\n\r\n'
print handshakes
c.send(handshakes)
sender("Hello", c)
break;
And the html, index.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Web Socket Example</title>
<meta charset="UTF-8">
<script>
window.onload = function() {
var s = new WebSocket("ws://localhost:9876/");
s.onopen = function(e) { alert("opened"); }
s.onclose = function(e) { alert("closed"); }
s.onmessage = function(e) { alert("got: " + e.data); }
};
</script>
</head>
<body>
<div id="holder" style="width:600px; height:300px"></div>
</body>
</html>
I'm running this code like this..
./server.py & python -m SimpleHTTPServer 8888
after running the server, when I hit localhost:8888 using browser, it alerts "opened" (means handshaking is done) at the same time alerts "closed" (connection closed) with the above error on console.
Not very clear how to debug this issue.
I'm using browser Chrome (version: 41), Python 2.7, Websocket 13.