Frage

Ich habe Arbeit gerade durch das erlang WebSockets Beispiel von Joe Armstrong Blog ich noch ganz zu erlang neu bin, damit ich einen einfachen Server in python schreiben entschieden, die lehren mich über WebSockets helfen würde (und hoffentlich auch einige erlang von Joes Code zu interpretieren). Ich habe zwei Fragen:

1) Data I von der Seite erhalten enthält eine ‚ÿ‘ als das letzte Zeichen. Dies scheint nicht in der Erlang-Version und ich kann nicht arbeiten, wo es herkommt Fixed - Das war, weil die Saiten, wo in utf-8 codiert, und ich war wieder entschlüsselt werden nicht

2) Ich scheine Daten vom Server zu Senden (durch die websocket) -, die durch Betrachten bestätigt werden kann, wie viele Bytes client.send () macht. Aber nichts ist, die auf der Seite. Feste, ich war nicht kodiert die Zeichenfolge richtig

Ich habe den gesamten Code setzen hier . Hier ist meine Python-Version incase ich bin fehlt etwas offensichtlich

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

Für diejenigen, die nicht durch Joes Beispiel laufen, aber immer noch wollen, zu helfen, brauchen Sie nur interact.html über einen Webserver zu dienen und dann starten Sie Ihren Server (Der Code nimmt der Webserver auf localhost läuft: 8888)

War es hilfreich?

Lösung

Für diejenigen, die interessiert sind, dies war die Lösung

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

Bearbeiten für liwp Anforderung:

Sie können eine diff der Datei anzuzeigen rel="noreferrer">. Im Grunde war mein Problem ist die Art und Weise war ich Decodierung / kodieren Strings vor dem Senden / Empfangen. Es gibt einen websocket Modul auf auf Google Code für Apache gearbeitet wird, die ich verwendet, um herauszufinden, wo ich schief gehen wurde.

Andere Tipps

Danke für den Code teilen. Ich lief in ein Problem diesen Code in Windows ausgeführt wird. Was ich denke, es könnte für Menschen helfen, die noch herauszufinden sind.

  1. I Strink den Raum, so dass es bacame 'Upgrade: WebSocket'

  2. Stellen Sie sicher, dass Ihr Hosting-Seite wird die Ursprungsabgleichs, der in diesem Fall ‚es ist http: // localhost: 8888

Es funktioniert für mich schön jetzt.

Eventlet hat websocket Unterstützung eingebaut und Sternentor ist ein Paket für WebSockets mit der Pyramide Web-Framework verwenden: http: / /boothead.github.com/stargate/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top