2010-01-28 4 views
9

Je viens de travailler sur l'exemple erlang websockets de Joe Armstrong's blog Je suis encore relativement nouveau sur erlang, j'ai donc décidé d'écrire un serveur simple en python qui m'aiderait à apprendre les websockets (et j'espère que certains erlang en interprétant le code de Joe). J'ai deux problèmes:Exemple Python de l'exemple websocket de Joe Erlang

1) Les données que je reçois de la page incluent un 'ÿ' comme dernier caractère. Cela ne figure pas dans la version Erlang et je ne peux pas savoir d'où il vient de fixe - En effet, les chaînes où encodée dans utf-8 et je ne les décoder

2) Je semble envoyer des données depuis le serveur (via la socket web) - ce qui peut être confirmé en regardant combien d'octets client.send() fait. Mais rien n'apparaît sur la page. Correction, je ne codais pas correctement la chaîne

J'ai mis tout le code here. Voici ma version python Incase me manque quelque chose d'évident

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

Pour ceux qui n'ont pas courir à travers l'exemple de Joe, mais toujours vouloir aider, il vous suffit de servir interact.html via un serveur Web, puis commencer votre serveur (le code suppose que le serveur Web est en cours d'exécution sur localhost: 8888)

Répondre

10

pour ceux qui sont intéressés par cette solution était la

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

Modifier pour la demande de liwp:

Vous pouvez afficher une diff du fichier here. Essentiellement, mon problème était la façon dont je décodais/encodais les chaînes avant d'envoyer/recevoir. Il y a un websocket module travaillé pour Apache sur google code que j'ai utilisé pour savoir où je me trompais.

+0

soin d'être un peu plus précis? Il est difficile d'essayer de comparer les deux fichiers sur une page Web. – liwp

0

Merci de partager le code. J'ai rencontré un problème lors de l'exécution de ce code dans Windows. Ce que je pense que cela pourrait aider pour les gens qui sont encore en train de figurer.

  1. Je STRINK l'espace, de sorte qu'il bacame 'Mise à jour: WebSocket'

  2. Assurez-vous que votre page d'accueil est correspondant à l'origine, qui, dans ce cas, il est 'http://localhost:8888'

Cela fonctionne magnifiquement pour moi maintenant.