Domanda

Ho appena lavorato attraverso l'erlang WebSockets esempio da blog di Joe Armstrong sono ancora abbastanza nuovo per Erlang così ho deciso di scrivere un semplice server in python che mi avrebbe aiutato insegnare circa WebSockets (e si spera un po 'di Erlang interpretando il codice di Joe). Sto avendo due questioni:

1) I dati che ricevo dalla pagina include un 'ÿ' come l'ultimo carattere. Questo non appare nella versione Erlang e non riesco a capire dove è venuta da fissi - Questo perché le stringhe in cui codificati in UTF-8 e non li

2) mi sembra di essere l'invio di dati dal server (tramite il websocket) - che può essere confermata, cercando in quanti byte client.send () fa. Ma niente sta comparendo sulla pagina. fissi, non ero codifica la stringa correttamente

Ho messo tutto il codice qui . 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)

È stato utile?

Soluzione

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 qui . In sostanza il mio problema era il modo in cui mi è stato decodifica / stringhe di codifica prima di invio / ricezione. C'è un websocket modulo sta lavorando per Apache su Google Code, che ho usato per scoprire dove ho stava andando male.

Altri suggerimenti

Grazie per la condivisione del codice. Mi sono imbattuto in un problema in esecuzione di questo codice in Windows. Che credo che potrebbe aiutare per le persone che stanno ancora cercando.

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

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

E 'di lavoro in modo bello per me, ora.

Eventlet ha il supporto websocket integrato e Stargate è un pacchetto per l'utilizzo WebSockets con il framework web piramide: http: / /boothead.github.com/stargate/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top