9
votes

Exemple de python de l'exemple de joe's erlang Websocket Exemple

Je viens de travailler à travers l'exemple d'Erlang Webockets de Blog de Joe Armstrong Je suis toujours tout à fait nouveau à Erlang, j'ai décidé d'écrire un serveur simple à Python qui aiderait à m'apprendre sur les standards (et j'espère que certains erlang en interprétant le code de Joe). J'ai deux problèmes:

1) Les données que je reçoivent de la page comprennent un "Ã" comme le dernier caractère. Cela n'apparaît pas dans la version erlang et je ne peux pas travailler là où il vient de fixe - c'était parce que les chaînes où elles sont codées dans UTF-8 et je ne les décodage pas

2) Je semble être d'envoyer des données du serveur (via la bande WebSocket) - qui peut être confirmée en examinant combien d'octets client.Send (). Mais rien ne figure sur la page. corrigé, je n'encodais pas la chaîne correctement

J'ai mis tout le code ici . Voici ma version Python en cas d'inconvénient, je manque tout ce qui est évident xxx

pour ceux qui n'ont pas traversé l'exemple de Joe, mais que je souhaite toujours aider, il vous suffit de servir d'interaction. HTML via un serveur Web, puis démarrez votre serveur (le code suppose que le serveur Web est en cours d'exécution sur localhost: 8888)


0 commentaires

3 Réponses :


10
votes

Pour ceux qui sont intéressés, c'était la solution

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()


1 commentaires

Soin d'être un peu plus précis? C'est un peu difficile d'essayer de diffuser les deux fichiers sur une page Web.



0
votes

Merci d'avoir partagé le code. J'ai rencontré un problème d'exécution de ce code dans Windows. Que je pense que cela pourrait aider pour les personnes qui figurent toujours.

  1. Je veux énoncer l'espace, de sorte que le barcom de la mise à niveau: Websocket '

  2. Assurez-vous que votre page d'hébergement correspond à l'origine, ce qui, dans ce cas, il est ' http: // localhost: 8888 < / a> '

    Cela fonctionne magnifiquement pour moi maintenant.


0 commentaires