Vandaag en gisteren ben ik in Python aan het prutsen geweest om een simpele server te schrijven welke communicatie mogelijk moet maken tussen webpagina's. Nouja, om precies te zijn moet hij iPads laten communiceren welke mbv Phonegab geschreven worden.
Nu loop ik tegen 2 problemen aan, de Safari browser op de iPad houdt de connectie niet in stand, hij maakt verbinding, ik stuur een (volgens mij) correcte handshake terug en Safari disconnect vervolgens.
De debugconsole van safari maakt verder geen error over dat de handshake verkeerd is dus het lijkt mij dat het correct is wat ik doe. Hieronder de functie die de handshake genereerd:
Chrome heeft WEL de laatste implementatie van websockets dus die gebruikt een andere functie voor de handshake, mischien werkt hij daarom wel in Chrome, maar ik weet dus niet of het aan mijn handshake ligt. Maar in de Chrome implementatie is het hele algoritme wat ik heb nog maar slechts 2 regels...
Het 2e probleem wat ik heb is dat de data niet correct aankomt. De headers tijdens de handshake zijn wel in echte tekst, maar zodra de verbinding tot stand is gebracht (nu in Chrome want die disconnect niet) dan ziet de data er zo uit:
� �|DE]
Tjah, wat moet ik hier dan mee.
Allemaal rare tekens, alsof hij binaire data ontvangt ofzo?
En helaas lukt het me niet om er achter te komen waar dit probleem dan ligt. Ik heb al geprobeerd om de data te decoden in utf-8 formaat maar helaas mocht dat niet baten.
Dit is de functie die inkomende berichten ophaalt:
Mijn gevoel zegt dat dit gewoon moet werken...
Zijn er toevallig meer mensen die wel eens een websocket server hebben gebouwd? Want ik begrijp helemaal niets van dit gedrag van de socketserver. Ik heb voorbeelden bekeken op het internet maar ik lijk het toch niet anders te doen dan andere mensen.
Als ik nou zou weten wat er dan precies fout gaat kan ik het oplossen, ik hoop dat iemand mij daar mee kan helpen. :-)
Nu loop ik tegen 2 problemen aan, de Safari browser op de iPad houdt de connectie niet in stand, hij maakt verbinding, ik stuur een (volgens mij) correcte handshake terug en Safari disconnect vervolgens.
De debugconsole van safari maakt verder geen error over dat de handshake verkeerd is dus het lijkt mij dat het correct is wat ik doe. Hieronder de functie die de handshake genereerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| def create_handshake_resp( self, handshake): final_line = "" lines = handshake.splitlines() for line in lines: parts = line.partition(": ") if parts[0] == "Sec-WebSocket-Key1": key1 = parts[2] elif parts[0] == "Sec-WebSocket-Key2": key2 = parts[2] elif parts[0] == "Host": host = parts[2] elif parts[0] == "Origin": origin = parts[2] final_line = line spaces1 = key1.count(" ") spaces2 = key2.count(" ") num1 = int("".join([c for c in key1 if c.isdigit()])) / spaces1 num2 = int("".join([c for c in key2 if c.isdigit()])) / spaces2 token = hashlib.md5(struct.pack('>II8s', num1, num2, final_line)).digest() return ( "HTTP/1.1 101 WebSocket Protocol Handshake\r\n" "Upgrade: WebSocket\r\n" "Connection: Upgrade\r\n" "Sec-WebSocket-Origin: %s\r\n" "Sec-WebSocket-Location: ws://%s/\r\n" "\r\n" "%s") % ( origin, host, token) |
Chrome heeft WEL de laatste implementatie van websockets dus die gebruikt een andere functie voor de handshake, mischien werkt hij daarom wel in Chrome, maar ik weet dus niet of het aan mijn handshake ligt. Maar in de Chrome implementatie is het hele algoritme wat ik heb nog maar slechts 2 regels...
Het 2e probleem wat ik heb is dat de data niet correct aankomt. De headers tijdens de handshake zijn wel in echte tekst, maar zodra de verbinding tot stand is gebracht (nu in Chrome want die disconnect niet) dan ziet de data er zo uit:
� �|DE]
Tjah, wat moet ik hier dan mee.
En helaas lukt het me niet om er achter te komen waar dit probleem dan ligt. Ik heb al geprobeerd om de data te decoden in utf-8 formaat maar helaas mocht dat niet baten.
Dit is de functie die inkomende berichten ophaalt:
code:
1
2
3
4
| def recv_data(self, client, count): data = client.recv(count) return data #return data.decode('utf-8', 'ignore') |
Mijn gevoel zegt dat dit gewoon moet werken...
Als ik nou zou weten wat er dan precies fout gaat kan ik het oplossen, ik hoop dat iemand mij daar mee kan helpen. :-)
Roses are red, violets are blue, unexpected '{' on line 32.