2010-01-28 8 views
9

Ho appena lavorato attraverso l'esempio di websocket di erlang da Joe Armstrong's blog Sono ancora abbastanza nuovo da erlang quindi ho deciso di scrivere un semplice server in python che mi aiutasse a insegnarmi le websocket (e spero che qualcuno possa interpretare interpretando il codice di joe). Ho due problemi:Esempio Python dell'Enlang websocket di Joe esempio

1) I dati ricevuti dalla pagina includono un 'ÿ' come ultimo carattere. Questo non appare nella versione Erlang e non riesco a capire dove è venuta da Fixed - Questo perché le stringhe in cui codificati in UTF-8 e non li stavo decodifica

2) mi sembra per inviare dati dal server (tramite websocket) - che può essere confermato osservando quanti byte client.send() fa. Ma nulla appare sulla pagina. Risolto, non stavo codificando correttamente la stringa

Ho messo tutto il codice here. Ecco la mia versione di Python in caso mi manca qualsiasi cosa ovvia

import threading 
import socket 

def start_server(): 
    tick = 0 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind(('localhost', 1234)) 
    sock.listen(100) 
    while True: 
     print 'listening...' 
     csock, address = sock.accept() 
     tick+=1 
     print 'connection!' 
     handshake(csock, tick) 
     print 'handshaken' 
     while True: 
      interact(csock, tick) 
      tick+=1 

def handshake(client, tick): 
    our_handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"+"Upgrade:  WebSocket\r\n"+"Connection: Upgrade\r\n"+"WebSocket-Origin:  http://localhost:8888\r\n"+"WebSocket-Location: "+" ws://localhost:1234/websession\r\n\r\n" 
    shake = client.recv(255) 
    print shake 
    client.send(our_handshake) 

def interact(client, tick): 
    data = client.recv(255) 
    print 'got:%s' %(data) 
    client.send("clock ! tick%d\r" % (tick)) 
    client.send("out ! recv\r") 

if __name__ == '__main__': 
    start_server() 

Per coloro che non hanno eseguito attraverso l'esempio di Joe, ma ancora voglia di aiutare, non vi resta che servire interact.html attraverso un server Web e quindi avviare il server (il codice presuppone il server web è in esecuzione su localhost: 8888)

risposta

10

per coloro che sono interessati questa era la soluzione

import threading 
import socket 

def start_server(): 
    tick = 0 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.bind(('localhost', 1234)) 
    sock.listen(100) 
    while True: 
     print 'listening...' 
     csock, address = sock.accept() 
     tick+=1 
     print 'connection!' 
     handshake(csock, tick) 
     print 'handshaken' 
     while True: 
      interact(csock, tick) 
      tick+=1 


def send_data(client, str): 
    #_write(request, '\x00' + message.encode('utf-8') + '\xff') 
    str = '\x00' + str.encode('utf-8') + '\xff' 
    return client.send(str) 
def recv_data(client, count): 
    data = client.recv(count)  
    return data.decode('utf-8', 'ignore') 

def handshake(client, tick): 
    our_handshake = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n"+"Upgrade:  WebSocket\r\n"+"Connection: Upgrade\r\n"+"WebSocket-Origin: http://localhost:8888\r\n"+"WebSocket-Location: "+" ws://localhost:1234/websession\r\n\r\n" 
    shake = recv_data(client, 255) 
    print shake 
    #We want to send this without any encoding 
    client.send(our_handshake) 

def interact(client, tick): 
    data = recv_data(client, 255) 
    print 'got:%s' %(data) 
    send_data(client, "clock ! tick%d" % (tick)) 
    send_data(client, "out ! %s" %(data)) 

if __name__ == '__main__': 
    start_server() 

Modifica per la richiesta di liwp:

È possibile visualizzare un diff del file here. Essenzialmente il mio problema era il modo in cui decodificavo/codificava le stringhe prima di inviare/ricevere. C'è un websocket module su cui si sta lavorando per Apache su codice google che ho usato per scoprire dove stavo sbagliando.

+0

cura per essere un po 'più specifico? È piuttosto difficile cercare di diffare i due file su una pagina web. – liwp

0

Grazie per aver condiviso il codice. Ho avuto un problema con questo codice in Windows. Quale penso che potrebbe aiutare per le persone che stanno ancora immaginando.

  1. ho strink lo spazio, in modo che bacame 'Aggiornamento: WebSocket'

  2. Assicurarsi che la pagina di hosting sta abbinando l'origine, che in questo caso si tratta di 'http://localhost:8888'

Funziona perfettamente per me ora.